unknown Type

huewilliams·2021년 8월 28일
0
post-thumbnail

배경

최근에 Slate 라이브러리를 공부하면서 예제에서 다음과 같은 인터페이스 정의 코드를 보게 되었다.

interface BaseProps {
  className: string
  [key: string]: unknown
}

매우 짧고 간단한 코드지만 이 코드안에 내가 모르는 개념이 두 가지나 있었다. 하나는 오늘 다룰 unknown이고 다른 하나는 Index Signature 개념이다. Index Signature 개념은 다음 포스팅에서 다룰 예정이다.
오늘의 주제인 unknown Type의 변수에 다른 모든 타입을 할당해도 되는 것은 알고 있지만 any와의 차이점이나 unknown의 필요성을 정확히 알지 못하고 있는 것 같아 공부하게 되었다.

정리

unknown Type

unknown type은 Typescript 3.0에서 추가된 타입이다. unknown은 Typescript의 탑 타입(Top Type)으로 Typescript의 모든 타입을 값으로 가질 수 있다.
unknown을 사용하는 것은 컴파일러에게 "이 변수는 어떤 타입이 될 지 모르니 추론해줘"라고 이야기해주는 것과 같다.

unknown vs any

unknownany 모두 모든 타입의 값이 할당될 수 있다는 공통점이 있지만 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
}

unknown를 언제 사용할까?

any 타입을 대체하는 용도로 사용된다. unknown 타입으로 지정하면 any 처럼 모든 타입의 값을 할당받을 수 있지만 그 값을 사용해야 할 때는 타입 체킹을 해서 안전하게 사용해야 한다. 따라서 any 보다 안전한 코딩이 가능해진다.

unknown with | and &

유니온(Union)은 타입의 합집합이다. 따라서 unknown 타입과 다른 타입을 |로 유니온 타입으로 합성하면 unknown 타입이 된다.
인터섹션(Intersection)은 타입의 교집합이다. 따라서 unknown 타입과 다른 타입을 &로 인터센션 타입으로 반환하면 대상 타입이 반환된다.

type unionType = unknown | string // unknown
type intersectionType = unknown & string // string

Reference

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/

0개의 댓글