타입스크립트 - 구조적 타이핑
구조적 타이핑
모든 속성이 동일하면 객체 타입의 이름이 다르더라도 동일한 타입으로 취급한다.
1
2
3
4
5
6
7
8
9
10
interface Memory {
amount: number;
unit: string;
}
type Memory2 = {
amount: number;
unit: string;
};
const liter: Memory = { amount: 1, unit: "liter" };
const circle: Memory2 = liter;
Memory와 Memory2는 모두 amount: number
,unit: string
속성을 가지고 있기때문에 동일한 타입으로 취급된다. 따라서 circle에 liter를 대입해도 오류가 발생하지 않는다.
배열이 매핑된 객체 타입인 경우에도 구조적 타이핑 특성이 나타난다.
1
2
3
4
5
type Arr = number[];
type CopyArr = {
[Key in keyof Arr]: Arr[Key];
};
const copyArr: CopyArr = [1, 2, 3];
Arr는 number타입의 배열이기때문에 key는 index, value는 number이다. CopyArr 역시 Arr의 Key값과 Value값을 사용하기 때문에 동일한 타입으로 취급된다.
동일한 타입으로 취급하지 못하게 하려면?
= 대입하지 못하게 하려면?
브랜드 속성을 사용하여 동일한 타입으로 취급하지 않도록 하면된다.
1
2
3
4
5
6
7
8
9
10
interface Money {
_type: "money";
amount: number;
unit: string;
}
interface Liter {
_type: "liter";
amount: number;
unit: string;
}
위의 코드의 경우 _type
이 없다면 구조적 타이핑 특성때문에 동일한 타입으로 취급되지만 _type
속성때문에 동일한 타입으로 취급되지 않는다. 따라 대입하지못한다.
위와 같이 객체를 구별할 수 있는 속성을 브랜드 속성
이라고 한다.
This post is licensed under CC BY 4.0 by the author.