[typescript] structural typing

참고

용어 정리

덕 타이핑(duck typing)

객체가 어떤 타입에 부함하는 변수와 메소드를 가질 경우 객체를 해당 타입에 속하는 것으로 간주하는 방식 자바스크립트가 이에 해당한다.

덕 테스트(The Duck Test)에서 유래되었다. "만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다."

그렇다면 해당 특성을 구현한 기계 오리는 오리? 이는 귀추법의 오류

const letDuckActive = (duck) => {
  duck.walk();
  duck.swim();
  duck.quack();
};

const duck = {
  walk: () => console.log('walk'),
  swim: () => console.log('swim'),
  quack: () => console.log('quack'),
}

letDuckActive(duck);

const robotDuck = {
  walk: () => console.log('w-a-l-k'),
  swim: () => console.log('s-w-i-m'),
  quack: () => console.log('q-u-a-ck'),
}

letDuckActive(robotDuck);

구조적 타이핑(structural typing)

구조적 타입 시스템(Structural Type System) 이라고도 불리며 실제 구조와 정의에 의해 결정되는 타입 시스템의 한 종류이다. 타입스크립트가 이에 해당한다.

명시적 선언이나 이름을 기반으로 하는 명목적 타입 시스템(Nominal Type System) 인 Java, C#등과 다르고 런타임에 타입을 체크하는 덕 타이핑(duck typing)과 다르다.

interface Vector2D {
  x: number;
  y: number;
}

const calculateLength = (v: Vector2D): number => {
  return Math.sqrt(v.x * v.y + v.y * v.y);
};

interface NamedVector {
  name: string;
  x: number;
  y: number;
}

const namedV: NamedVector = {
  name: "somewhere",
  x: 2,
  y: 3,
};

/**
 * Vector2D와 NamedVector의 관계를 별도로 선언하지 않아도 동작
 * 타입스크립트 타입 시스템은 자바스크립트의 런타임 동작을 모델링
 * NamedVector의 구조가 Vector2D와 호환되기 때문에 정상 호출 가능
 */
calculateLength(namedV);

위 예제는 명목적 타입 시스템을 기준으로 Vector2D를 사용하도록 의도한 코드 하지만 구조적 타이핑 언어에서는 전혀 다른 개념으로 이해해야 한다. Vector2D의 타입이 파라미터에 존재하는가를 체크

links

social