아이템 4. 구조적 타이핑에 익숙해지기 #
자바스크립트는 본질적으로 ‘덕 타이핑(duck typing)’ 기반이다. #
덕타이핑이란?
어떤 값에 필요한 속성, 메서드가 존재한다면 그냥 사용하는 것을 의미한다.
타입스크립트는 자바스크립트의 런타임 동작을 모델링한다.
덕타이핑을 모델링하기 위해 ‘구조적 타이핑’ 기법을 사용한다. (올바른 표현인가…?)
interface Vector2D {
x: number;
y: number;
}
interface NamedVector2D {
name: string;
x: number;
y: number;
}
function calculateLength(v: Vector2D) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}
» tsc example.js
»
» cat example.js
function calculateLength(v) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}
자바스크립트의 ‘덕타이핑’ 개념이 당여한다는 가정 하에, 타입스크립트의 ‘구조적 타이핑’ 은 어떻게 보면 당연한 것일 수 있다. (위의 코드처럼
.js
로 트랜스파일 이후에 선언된 타입은 모두 제거되기 때문에)
클래스에도 구조적 타이핑이 적용된다. #
class C {
foo: string;
constructor(foo: string) {
this.foo = foo;
}
}
const c = new C('hi'); // OK
const d: C = { foo: 'hi'; } // OK (구조적 타이핑에 의해)
console.log(c); // C { foo: 'hi' }
console.log(c.constructor); // [Function: C]
console.log(d); // { foo: 'hi' }
console.log(d.constructor); // [Function: Object]
요약 / 정리 #
1. 자바스크립트가 ‘덕 타이핑’ 기반이고, 타입스크립트가 이를 모델링하기 위해 ‘구조적 타이핑’을 사용한다.
2. 클래스도 구조적 타이핑 규칙을 따른다. 클래스의 인스턴스가 예상과 다를 수 있다.
+ js 에서는 호환성(= 생산성, 다형성, …) 을 중요하게 생각했던 것 같다. (+ 참고 : 덕 타이핑과 구조적 타이핑)
C, Java 등의 정적타입언어에는 엄격한 타입 시스템이 적용되어 있다. 이는 생산성, 접근성 등을 어렵게 하는 요인 중 하나인데, 이 문제를 해결하고자 C++, Java 에서는 다형성을 도입했다. (= 상속, 인터페이스로 이 문제를 해결한 것)
반면에 Javascript 에서는 (이러한 문제에 대해서) 애초에 동적타이핑을 통해 해결하고자 했다. 이 동적타이핑을 통해 자바스크립트에서도 (C, Java에서 표현하는, 다형성이라고 표현하는게 올바른지 모르겠지만) ‘다형성’의 개념이 녹아져있다. 때문에 C, Java에서 말하는 다형성의 이점들(역할, 구현의 분리 등)을 동일하게 사용한다고 볼 수 있을 것 같다.