React hook form에서 특정 타입을 추론하지 못해 as unkown as
를 통해 특정 타입을 강제로 지정해주는 경우가 있었습니다.
이 과정에서 unknown
에 대한 궁금증이 생겼고 이에 대해 정리해보려 합니다.
any
unknown
타입을 이야기하기 전에 any
타입을 먼저 살펴보려합니다.
Typescript의 모든 타입은 any
는 모든 타입을 할당받을 수 있는 타입입니다. 사용자로부터 받은 데이터 혹은 써드 파티 라이브러리 같은 동적인 컨텐츠로 오는 불특정한 값을 컴파일 검사를 하지 않고 사용하고자 할때 사용합니다.
컴파일 중 타입검사를 하지 않으므로 기존의 Javascript 와 같이 작업하기에 용이합니다.
예시
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;
unkown
unknown
은 Typescript의 탑 타입(Top Type)입니다. 따라서 Typescript에 있는 모든 타입을 포함하여 어느 값이든 가질 수 있습니다.
unknown
을 사용하는 것은 컴파일러에게 "이 변수는 어떤 타입이될지몰라 너가 추론해줘" 라고 이야기해주는 것과 같습니다.
예시
let notSure: unknown = 4;
notSure = "maybe a string instead";
// 오! notSure은 Boolean 이구나!
notSure = false;
unknown vs any
unknown
타입도 any
타입도 모든 타입의 값이 할당될 수 있다는 공통점을 가지고 있지만, 차이점 또한 가지고 있습니다.
unknown 할당
let variable: unknown
let anyType: any = variable
let booleanType: boolean = variable
// Error: Type 'unknown' is not assignable to type 'boolean'.(2322)
let numberType: number = variable
// Error: Type 'unknown' is not assignable to type 'number'.(2322)
let stringType: string = variable
// Error: Type 'unknown' is not assignable to type 'string'.(2322)
let objectType: object = variable
// Error: Type 'unknown' is not assignable to type 'object'.(2322)
unknown
타입은 any
타입을 제외한 다른 타입으로 선언한 변수에 할당할 수 없습니다.
unknown으로 선언된 변수의 property
let variable: unknown
variable.foo.bar // Error: Object is of type 'unknown'.(2571)
variable[0] // Error
variable.trigger() // Error
variable() // Error
new variable() // Error
unknown
타입으로 선언된 변수는 프로퍼티에 접근할 수 없으며, 인스턴스를 생성할수도 없습니다.
마무리
any
를 사용하는 곳에서 unknown
을 사용하여 보다 안전하게 코딩이 가능합니다. any
는 타입을 좁혀서 사용하지 않아도 되지만, unknown
은 타입을 좁혀서 사용해야만 합니다.
unknown
타입으로 지정된 값은 타입을 먼저 확인한 후에 무언가를 할 수 있으므로 unknown
을 사용하는 것이 보다 안전합니다.
참고 자료
- Typescript handbook: https://typescript-kr.github.io/pages/basic-types.html#any
- unkonwn, any https://simsimjae.tistory.com/464
- unknown type: https://jbee.io/typescript/TS-9-unknown/
'Language > TypeScript' 카테고리의 다른 글
타입스크립트 덕 타이핑과 구조적 타이핑 (0) | 2022.03.12 |
---|---|
선언형 프로그래밍을 알아보자 (0) | 2021.01.10 |
Typescript Enum이란? (0) | 2021.01.05 |