1장 타입스크립트 알아보기
아이템 4 | 구조적 타이핑에 익숙해지기
3줄 요약
1. 자바스크립트는 본질적으로 덕 타이핑 기반이다.
2. 자바스크립트의 런타임 동작 모델링한 타입스크립트 또한 덕 타이핑을 기반으로 한다.
3. 덕 타이핑에 제대로 이해해서 활용하자.
참고) 이펙티브 타입스크립트는 타입스크립트의 기본 그 이상을 다룹니다.
덕 타이핑은 아래와 같은 문구로 유명합니다.
만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면
나는 그 새를 오리라고 부를 것이다.
- 위키피디아 검색 <덕 타이핑>
어떤 새가 본래 오리로 태어났는가는 중요하지 않습니다.
오리처럼 행동하면 그것은 오리라고 말할 수 있습니다.
이것이 우리가 익히 알고있는 덕 타이핑을 나타내는 표현입니다.
타입스크립트에서 타입을 체크하는 방식 또한 이와 유사합니다.
이렇게 Person 인터페이스를 정의하고 sayHi라는 함수의 파라미터의 타입으로 받는다고 가정해보겠습니다.
아주 잘 동작합니다.
그런데 여기서 Person 대신에 Monkey라는 인터페이스를 만들어서 Person 타입의 파라미터에 넣어보도록 하겠습니다.
Monkey 타입에는 3가지 속성이 있습니다. 그중 name과 age는 Person에도 존재합니다.
Person의 속성을 모두 Monkey가 가지고 있는거죠.
때문에 덕 타이핑으로 인해 sayHi 함수에 인자로써 넣을 수 있었습니다.
덕 타이핑을 수학적으로 풀어보자면 특정 타입이 들어갈 수 있는 자리에는 그 특정 타입의 부분 집합 타입 또한 들어갈 수 있습니다.
세상에 무수히 많은 오브젝트 타입들이 있다고 가정해봅시다.
어떤 오브젝트 타입(A)은 프로퍼티 a를 가지고 어떤 오브젝트 타입(AB)은 프로퍼티 a와 추가적으로 프로퍼티 b를 가지고 있다고 했을 때,
이 둘 간의 관계를 어떻게 말할 수 있을까요?
언뜻 보기에는 AB가 더 많은 프로퍼티를 가지고 있으니, A보다 AB가 더 큰 집합처럼 느껴지기도 합니다.
그러나 프로퍼티는 제약 조건이라고 생각하는 것이 좋습니다. 제약 조건이 많을수록 그 타입에 해당하는 요소들은 더 적을 것입니다.
따라서, AB는 A의 부분집합입니다. A의 타입이 들어갈 수 있는 자리라면 AB도 들어갈 수 있습니다.
명확히 A의 타입만 들어가는 것이 아니기에 타입이 열려있다(open)라고 표현합니다.
반대로, A의 자리에 A만 들어갈 수 있도록 하는 것이 봉인된(sealed) 타입, 혹은 정확한(precise) 타입이라고 합니다.
덕 타이핑으로 인해 의도하지 않은 에러 또한 만날 수 있습니다.
그리고 타입 체크는 덕 타이핑으로 인해 이를 에러라고 말하지 않습니다.
개발자의 의도와는 다르게 나왔으나 타입스크립트의 타입 체크는 에러라고 알려주지 않습니다.
이렇듯 덕 타이핑의 특성을 잘 이해해서 프로그램을 작성하는 것이 중요합니다.
Materials From
1. <이펙티브 타입스크립트>(댄 밴더캄 지음, 장원호 옮김, 인사이트 2021)
2. 타입스크립트 공식 홈페이지 | https://www.typescriptlang.org/
참고)
구조적(structural) 타입 시스템과 반대되는 말은 명목적(nominal) 타입 시스템이다.
'개발 > 이펙티브 타입스크립트' 카테고리의 다른 글
[이펙티브 타입스크립트+6] 편집기를 사용하여 타입 시스템 탐색 (0) | 2021.08.03 |
---|---|
[이펙티브 타입스크립트+5] any 타입 지양하기 (0) | 2021.08.02 |
[이펙티브 타입스크립트+3] 코드 생성과 타입이 관계없음 (0) | 2021.08.01 |
[이펙티브 타입스크립트+2] 타입스크립트 설정 (noImplicitAny / strictNullChecks) (0) | 2021.08.01 |
[이펙티브 타입스크립트+1] 자바스크립트와 타입스크립트 관계 (0) | 2021.08.01 |