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 |