타입스크립트에는 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 |