참고
용어 정리
덕 타이핑(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의 타입이 파라미터에 존재하는가를 체크