아이템 42 모르는 타입의 값에는 any 대신 unknown을 사용하기
any의 특성
- 어떠한 타입이든 any 타입에 할당 가능하다.
- any 타입은 never를 제외한 어떠한 타입으로도 할당 가능하다.
이러한 any의 특성은 집합 기반의 타입시스템과 상충된다. 따라서 any를 쓰면 타입 체커가 무용지물이 된다. 마치 any와 같은 역할을 하면서 타입시스템에 부합하는 타입이 바로 unknown
이다.
unknown의 특성
- 어떠한 타입도 unknown에 할당 가능하다.
- 오직 unknown과 any에만 할당 가능하다.
never의 특성
- 어떤 타입도 never에 할당 할 수 없다.
- 어떠한 타입으로도 할당 가능하다.
1. unknown의 함수의 반환값과 관련된 형태
함수의 반환타입으로 any를 쓰는 것은 좋지 않기 때문에 그보다는 함수를 호출한 곳에서 반환값을 원하는 타입으로 할당하는 것이 바람직하다. 그러나 함수의 반환값에 타입 선언을 강제할 수 없기 때문에 호출한 곳에서 타입 선언을 생략하면 아래 예제를 예시로 들었을 때 1️⃣, 2️⃣처럼 book 변수가 암시적 any타입이 되고, 사용되는 곳마다 타입 오류가 발생한다. 이런 경우에 any 대신 unknown을 쓰면 훨씬 안전하다.
1 | function parseYAML(yaml: string): any { |
하지만 unknown인 타입의 값을 사용하려고 하거나 함수 호출 또는 연산을 진행할 때 오류가 발생하기 때문에 적절한 타입으로 변환하도록 강제할 수 있다.
2. 변수선언과 관련된 unknown
어떠한 값이 있지만 그 타입을 모르는 경우에 사용한다.
아이템 43 몽키 패치보다는 안전한 타입을 사용하기
몽키 패치는 프로그램이 런타임 되는 동안 사용되는 모듈이나 클래스를 변경하는 것이다. 자바스크립트는 객체와 클래스에 임의의 속성을 추가할 수 있을 만큼 유연하기 때문에 이 성질을 이용해서 전역 변수를 만들 수도 있다. 예를 들어 window나 document에 값을 할당해서 전역 변수를 만드는 것이다. 그런데 window 또는 DOM 노드에 데이터를 추가하면 그 데이터는 기본적으로 전역 변수기 때문에 프로그랢 내에서 의존성을 만들고, 사이드 이펙트를 만들 수 있다. 그리고 타입스크립트의 타입 체커는 아래와 같이 임의로 추가한 속성에 대해서 알지 못한다.
1 | document.monkey = 'Tamarin' |
References
[이펙티브 타입스크립트] 댄 밴더캄 지음