티스토리 뷰
구조적 타이핑을 보여주는 코드
- 정의된 코드 타입을 충족한다면 타입스크립트는 동일 타입으로 간주한다.
- DogInfo와 mallangInfo 타입이 완전 똑같지 않지만 타입스크립트는 정의된 코드를 충족시킨다고 보고 오류 발생시키지 않는다.
interface DogInfo {
name: string;
age: number;
}
const mallangInfo = {
name: "mallang",
age: 5,
weight: "3kg",
likes: ["chicken", "snack"],
};
const getMallangAge = (info: DogInfo) => {
return info.age;
};
getMallangAge(mallangInfo);
구조적 타이핑으로 인한 구조적 타입과 유니언 타입의 차이
코드 예시
keyof (A&B) = (keyof A) | (keyof B)
keyof (A|B) = (keyof A) & (keyof B)
구조적 타입(인터페이스)의 교집합 Intersection
- 교집합이 되려면, 타입 관점에서 A에도 속하고 B에도 속해야 한다.
구조적 타입의 유니온 타입일 때의 교집합
- 어떤 타입이 A에 속하거나 아니면 B에 속해야 한다. A와 B의 공통요소
interface Dog {
name: string;
}
interface Likes {
snack: string;
toy: string;
}
type DogLikes1 = keyof (Dog | Likes); // never
type DogLikes2 = keyof (Dog & Likes); // type DogLikes2 = "name" | keyof Likes
결론
- 유니언 타입에서의 교집합, 합집합과 구조적 타입(인터페이스)의 교집합 합집합은 다르다.
- 구조적 타입에서는 정의된 타입이 포함되어야 동일한 타입으로 받아들이기 때문에 구조의 합집합에 해당한다. (&)
- 구조적 타입의 유니언 타입은 A 타입에 속하거나 B타입에 속하는 공통 요소(교집합)을 의미한다. 따라서 유니언 타입을 집합의 관점이 아니라 개별 원소로만 보아야 한다. extends를 유니언에서 사용할 수 없는 이유.