개발/이펙티브 타입스크립트

[이펙티브 타입스크립트+4] 타입스크립트 구조적 타이핑 (structure typing / duck typing)

Junghyun Kim 2021. 8. 2. 20:14
반응형

https://www.typescriptlang.org/docs/handbook/interfaces.html

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) 타입이라고 합니다.

덕 타이핑으로 인해 의도하지 않은 에러 또한 만날 수 있습니다.
그리고 타입 체크는 덕 타이핑으로 인해 이를 에러라고 말하지 않습니다.

z의 값은 약 1.41 정도 값이 나와야한다.

개발자의 의도와는 다르게 나왔으나 타입스크립트의 타입 체크는 에러라고 알려주지 않습니다.
이렇듯 덕 타이핑의 특성을 잘 이해해서 프로그램을 작성하는 것이 중요합니다.

 

Materials From
1. <이펙티브 타입스크립트>(댄 밴더캄 지음, 장원호 옮김, 인사이트 2021)
2. 타입스크립트 공식 홈페이지 | https://www.typescriptlang.org/

 

Typed JavaScript at Any Scale.

TypeScript extends JavaScript by adding types to the language. TypeScript speeds up your development experience by catching errors and providing fixes before you even run your code.

www.typescriptlang.org


참고)

TypeScript: Documentation - TypeScript for Java/C# Programmers (typescriptlang.org)

구조적(structural) 타입 시스템과 반대되는 말은  명목적(nominal) 타입 시스템이다.

반응형