Post

타입스크립트 - 구조적 타이핑

구조적 타이핑

모든 속성이 동일하면 객체 타입의 이름이 다르더라도 동일한 타입으로 취급한다.

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.