Language/TypeScript

Typescript unknown, any 차이

SambaLim 2021. 3. 31. 17:27

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

Type

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 을 사용하는 것이 보다 안전합니다.

참고 자료

'Language > TypeScript' 카테고리의 다른 글

타입스크립트 덕 타이핑과 구조적 타이핑  (0) 2022.03.12
선언형 프로그래밍을 알아보자  (0) 2021.01.10
Typescript Enum이란?  (0) 2021.01.05