덕 타이핑과 잉여 속성 체크

김동규·2023년 4월 30일
0

덕 타이핑

만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.

타입스크립트는 타입체크시 필요로 하는 타입의 property와 method가 모두 있는지 만을 체크한다. 즉, 실제 parameter가 함수에 정의된 argument보다 많은 property와 method를 가져도 용인한다.

타입스크립트에서 함수를 작성하는 시점에 닫힌 타입을 요구하는 것은 불가능하다.

brand & Tagged Union

타입스크립트에서 구조적으로 보장하는 것은 불가능하지만 책에서 소개되는 몇몇 방법으로 실수를 방지하는 정도는 가능해보인다.

아이템 37에서 소개되는 brand는 형태상 초반에 소개된 Tagged Union과 같아보인다. 실제로 런타임의 상표를 검사하는 것과 동일한 효과를 얻을 수 있다고 명시되어 있기도 하다.

interface Coffee {
	_brand: 'starbucks'
  	// ...
}

잉여 속성 체크

그런데 덕 타이핑이 전부라면 타입스크립트로 정확한 타입을 확인하는게 불가능하기 때문에 잉여 속성 체크가 추가로 존재한다.

잉여 속성 체크는 타입이 명시된 변수에 객체 리터럴을 할당할 때 타입의 속성이 있는지, '그 외의 속성은 없는지' 확인한다.

interface Room {
	doorNumber: number;
	ceilngHeight: number;
}

const r: Room = {
	doorNumber: 1,
	cilingHeight: 10,
	elephant: '', // 잉여 속성 체크로 인해 할당 불가 
}
  
const obj = {
	doorNumber: 1,
	cilingHeight: 10,
	elephant: 'present',
} 
const r: Room = obj;
// 잉여 속성 체크가 동작하지 않아 할당 가능

공통 속성 체크

선택적 속성만을 가지는(?:) 약한 타입에서는 공통 속성 체크를 수행한다. 잉여 속성 체크와 다르게 임시변수를 사용한 것과 객체 리터럴을 통한 선언 모두 오류를 표시한다.

profile
공식문서를 사랑하는 프론트엔드 주니어 개발자

0개의 댓글