Types vs Interfaces
객체 형태를 선언하는 주요 도구는 두 가지가 있습니다.
인터페이스와 타입 별칭입니다.
이 둘은 무척 비슷하며,
대부분 동일하게 작동합니다.
// TypeScript는 구조적 타입 시스템을 따르기 때문에,
교차하여 사용하는 것도 가능합니다.
type BirdType = {
wings: 2;
};
interface BirdInterface {
wings: 2;
}
const bird1: BirdType = { wings: 2 };
const bird2: BirdInterface = { wings: 2 };
// 둘 다 다른 인터페이스와 타입으로의 확장이 가능합니다.
타입 별칭은 교차 타입을 통해 이를 수행하는 반면,
인터페이스는 키워드를 사용합니다.
const bird3: BirdInterface = bird1;
// 그래도 타입 별칭보다 인터페이스를 쓰는 것을 추천합니다.
분명히 더 나은 에러 메시지를 받을 수 있기 때문입니다.
뒤따르는 에러에 커서를 가져가면,
Chicken과 같은 인터페이스를 사용했을 때
TypeScript가 더 간결하고 정확한 메시지를 어떻게 제공하는지 알 수 있습니다.
type Owl = { nocturnal: true } & BirdType;
type Robin = { nocturnal: false } & BirdInterface;
interface Peacock extends BirdType {
colourful: true;
flies: false;
}
interface Chicken extends BirdInterface {
colourful: false;
flies: false;
}
let owl: Owl = { wings: 2, nocturnal: true };
let chicken: Chicken = { wings: 2, colourful: false, flies: false };
// 타입 별칭과 인터페이스 사이 한 가지 주요한 차이점은
인터페이스는 열려 있고 타입 별칭은 닫혀 있다는 것입니다.
이는 인터페이스를 다음에 선언할 때
확장할 수 있음을 의미합니다.
owl = chicken;
chicken = owl;
// 이와 달리 타입은 선언 바깥에서
변경할 수 없습니다.
interface Kitten {
purrs: boolean;
}
interface Kitten {
colour: string;
}
// 목적에 따라서, 이 차이는 좋을 수도 나쁠 수도 있습니다.
하지만 공개된 타입들의 경우,
그것들을 인터페이스로 만드는 것이 더 좋습니다.
타입과 인터페이스에 대한 모든 엣지 케이스를 알고 싶다면,
아래 stack overflow thread가
시작하기 좋은 훌륭한 자료가 될 것입니다.
https://stackoverflow.com/questions/37233735/typescript-interfaces-vs-types/52682220#52682220
type Puppy = {
color: string;
};
type Puppy = {
toys: number;
};