티스토리 뷰

anyunknown 모두 모든 타입들의 super set이다. 즉 어떤 타입도 anyunknown에 넣을 수 있다.
하지만 unknown은 자기 자신과 any를 제외한 다른 타입에 할당할 수 없다. (Anything is assignable to unknown but unknown isn't assignable to anything but itself and any)

const vAny: any = 10; // any에 어떤 것도 집어넣을 수 있다.
const vUnknown: unknown = 10; // any처럼 unknown에도 어떤 것도 집어넣을 수 있다. 

let s1: string = vAny; // any는 어떤 것에도 집어넣어진다. 
let s2: string = vUnknown; // Invalid! unknown은 any나 unknown을 제외한 다른 타입에 할당할 수 없다.  
let s3: unknown = vUnknown; // 같은 unknown 타입 또는 any 타입에는 할당 가능

vAny.method(); // 가능
vUnknown.method(); // 불가능. unknown 타입은 어떤 프로퍼티에도 접근이 불가능하다. 

다만, 명시적으로 type assertion이 있거나 타입 체킹을 하면 다른 타입에 할당하거나 프로퍼티 접근이 가능하다.

let foo: unknown = 10;

function hasXYZ(obj: any): obj is {x: any, y: any, z: any} {
  return !!obj && typeof obj === "object" && "x" in obj && "y" in obj && "z" in obj;
}

if (hasXYZ(foo)) {
    // foo는 unknown 타입임에도 타입 가드를 사용하면 프로퍼티 접근이 허용된다
    foo.x.prop;
    foo.y.prop;
    foo.z.prop; 
}

let s: string = foo as string // type assertion을 사용하면 다른 타입에 할당 가능

이런 제한이 있기 때문에 만약 어떤 값이든 들어올 수 있지만 사용 전에 타입 체킹이 필요한 경우 등에 사용할 수 있다.

Ref

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함