본문 바로가기

JavaScript/Typescript

TypeScript - Type System

타입스크립트에는 Structural Type System과 Nominal Type System의 두 가지 체계가 있습니다.

타입스크립트는 기본적으로 Structural Type System을 따릅니다.

 

1. Structural Type System

  • 구조가 같으면, 같은 타입이다.
interface IDuck {
    quack(): void;
}

class MallarDuck implements IDuck {
    quack() {
        console.log('Quack!');
    }
}

class RedheadDuck {
    quack() {
        console.log('q~uack!');
    }
}

function makeNoise( duck: IDuck ) {
    console.log( duck.quack() );
}

makeNoise( new MallarDuck() );
makeNoise( new RedheadDuck() );

위 makeNoise 함수에선 IDuck을 인자로 받고 있습니다.

RedheadDuck 클래스는 IDuck을 implements 한 적이 없지만, ReadheadDuck 클래스에 quack()이라는 메서드가 정의되어 있고, ReadheadDuck 클래스가 IDuck의 quack을 구현했다고 보기 때문에 오류가 발생하지 않습니다.

이를 구조적 타입 시스템(=Duck Typing)이라고 합니다.

 

Duck Typing은 아래의 말에서 유래되었다고 합니다.

 

만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.

2. Nominal Type System

  • 구조가 같아도 이름이 다르면, 다른 타입이다.
type PersonID = string & { readonly brand: unique symbol };

function PersonID(id: string): PersonID {
  return id as PersonID;
}

function getPSersonByID(id: PersonID) {}

getPSersonByID( PersonID('id-aaaaaa') );
getPSersonByID( 'id-aaaaaa' );

 

'JavaScript > Typescript' 카테고리의 다른 글

TypeScript - class  (0) 2022.01.13
TypeScript - interface  (1) 2022.01.12
TypeScript - 타입 호환성  (0) 2022.01.10
TypeScript - Type의 종류  (1) 2022.01.10
TypeScript - 기본 개념과 설치해보기  (0) 2022.01.06