최근에 Slate 라이브러리를 공부하면서 예제에서 다음과 같은 인터페이스 정의 코드를 보게 되었다.
interface BaseProps {
className: string
[key: string]: unknown
}
매우 짧고 간단한 코드지만 이 코드안에 내가 모르는 개념이 두 가지나 있었다. 하나는 오늘 다룰 unknown
이고 다른 하나는 Index Signature
개념이다. Index Signature
개념은 다음 포스팅에서 다룰 예정이다.
오늘의 주제인 unknown
Type의 변수에 다른 모든 타입을 할당해도 되는 것은 알고 있지만 any
와의 차이점이나 unknown
의 필요성을 정확히 알지 못하고 있는 것 같아 공부하게 되었다.
unknown
type은 Typescript 3.0에서 추가된 타입이다. unknown
은 Typescript의 탑 타입(Top Type)으로 Typescript의 모든 타입을 값으로 가질 수 있다.
unknown
을 사용하는 것은 컴파일러에게 "이 변수는 어떤 타입이 될 지 모르니 추론해줘"라고 이야기해주는 것과 같다.
unknown
과 any
모두 모든 타입의 값이 할당될 수 있다는 공통점이 있지만 any
와는 다른 unknown
의 특징이 있다.
unknown 할당
let unknownVar: unknown;
let anyType: any = unknownVar;
let booleanType: boolean = unknownVar;
// error TS2322: Type 'unknown' is not assignable to type 'boolean'.
let numberType: number = unknownVar;
// error TS2322: Type 'unknown' is not assignable to type 'number'.
let stringType: string = unknownVar;
// error TS2322: Type 'unknown' is not assignable to type 'string'.
let objectType: object = unknownVar;
// error TS2322: Type 'unknown' is not assignable to type 'object'.
unknown
타입은 any
타입을 제외한 다른 타입으로 선언한 변수에 할당할 수 없다.
unknown으로 선언된 변수의 property
unknown
타입으로 선언된 변수는 프로퍼티에 접근할 수 없으며, 메소드를 호출할 수 없으며, 인스턴스를 생성할 수도 없다.
let variable: unknown
variable.foo.bar // Error
variable[0] // Error
variable.trigger() // Error
variable() // Error
new variable() // Error
다음과 같이 Type Guard
해주거나 Type Assertion
을 해주면 가능해진다.
let variable: unknown
declare function isFunction(x: unknown): x is Function
if (isFunction(variable)) {
variable() // OK
}
any
타입을 대체하는 용도로 사용된다. unknown
타입으로 지정하면 any
처럼 모든 타입의 값을 할당받을 수 있지만 그 값을 사용해야 할 때는 타입 체킹을 해서 안전하게 사용해야 한다. 따라서 any
보다 안전한 코딩이 가능해진다.
유니온(Union)
은 타입의 합집합이다. 따라서 unknown
타입과 다른 타입을 |
로 유니온 타입으로 합성하면 unknown
타입이 된다.
인터섹션(Intersection)
은 타입의 교집합이다. 따라서 unknown
타입과 다른 타입을 &
로 인터센션 타입으로 반환하면 대상 타입이 반환된다.
type unionType = unknown | string // unknown
type intersectionType = unknown & string // string
https://roseline.oopy.io/dev/typescript-unknown-vs-any-type
https://simsimjae.tistory.com/464
https://sambalim.tistory.com/146
https://jbee.io/typescript/TS-9-unknown/