본문 바로가기

Language/Typescript

[Typescript] unknown과 any의 차이

728x90
반응형

1. unknown 타입은 any를 제외한 다른 타입에 할당할 수 없다. 

Typescript 3.0 버전부터 추가된 타입이다. any와 마찬가지로 모든 타입의 값을 할당할 수 있다.

그렇다면 그냥 any로 사용하면 되지 왜 unknown이 필요한걸까?

 

typescriptlang.org의 설명에 따르면 unknown 타입은 any 타입 외의 어떤 타입에도 할당할 수 없다.

반면 any는 never를 제외한 모든것에 할당 가능하다.

 

조금 더 쉽게 코드로 예시를 들어보자면, 

let varr:unknown
let booleanType:boolean = varr // Type 'unknown' is not assignable to type 'boolean'

let bool:boolean = true
let unkw:unknown = bool

boolean 타입에는 unknown 타입을 대입할 수 있지만, unknown 타입에는 boolean 타입을 대입할 수 없다.

이렇듯 unknown 타입에는 어떤 것을 대입하는 것이 유효하지 않기 때문에 any 타입보다 더욱 안전하다.

 

 

반면, any 타입은 never를 제외한 모든 타입에 할당하는 것이 가능하다. 

let anyValue: any
let hi:boolean = anyValue

이는 치명적인 실수를 불러올 가능성을 만든다.

 

const anytype:any = true
const hi:string = anytype
hi.toUpperCase()

any 타입은 어느 타입에도 할당할 수 있기 때문에 개발자가 이런 코드를 작성하더라도 오류가 발생하지 않지만, 런타임에는 true.toUpperCase()를 하는것이나 다름없기 때문에 런타임 에러를 발생시킬 것이다.

 

2. unknown 타입은 타입좁히기 없이는 메서드 호출, 인스턴스 생성,프로퍼티 접근을 할 수 없다.

let anyValue: any
anyValue.toUpperCase()

any타입은 메서드 호출에 제한이 없다. anyValue가 string이라는 보장이 없는데도 string 메서드인 toUpperCase()를 호출하고있지만 타입스크립트는 이를 허용한다.

 

let unknownValue: unknown
unknownValue.toUpperCase() // error!

반면 unknown 타입의 경우에는 error가 발생한다. 이를 해결하기 위해서는 unknown 타입을 string으로 좁혀주어야 한다.

 

const unknownArgFunction = (value:unknown) => {
  value.toUpperCase() // unknown 타입에는 메서드를 호출할 수 없다.
  if(typeof value === 'string') {
    value.toUpperCase() // string으로 타입을 좁혀준 뒤 메서드를 호출
  }
}
728x90
반응형

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

[Typescript] 제네릭(Generics)  (0) 2022.02.21
[Typescript] 클래스(Class)  (0) 2022.02.20
[Typescript] 리터럴, 유니온/교차 타입  (0) 2022.02.19
[Typescript] 함수  (0) 2022.02.18
[Typescript] 인터페이스(interface)  (0) 2022.02.17