type Person = {
name: string;
age: number;
};
let person: Person = {};
person.name = "";
person.age = 23;
위와 같은 코드는 타입스크립트에서 오류를 발생시킵니다.
할당하려고 하는 빈 객체가 Person
타입이 아니기 때문입니다.
하지만 초기화 할 때에는 빈 객체로 넣어두고 싶을 수도 있습니다.
이를 위해서 타입 단언을 사용할 수 있습니다.
type Person = {
name: string;
age: number;
};
let person = {} as Person;
person.name = "";
person.age = 23;
값 as 타입
의 형태로 특정 값을 원하는 타입으로 단언하면 됩니다.
이는 초과 프로퍼티 검사를 피할 때에도 자주 사용합니다.
type Dog = {
name: string;
color: string;
};
let dog: Dog = {
name: "돌돌이",
color: "brown",
breed: "진도",
} as Dog
위와 같은 코드에서 Dog
타입으로 변수를 선언했지만 초기화하는 객체가 정확하게 Dog
타입이 아닌 객체 리터럴을 할당하면 초과 프로퍼티 검사가 발동합니다.
이를 피하기 위해서 다른 변수에 값을 보관해두었다가 할당하는 방법을 사용할 수도 있지만 간단하게 타입 단언을 통해 해결할 수도 있습니다.
타입 단언을 사용할때는 조건이 있습니다.
A as B
로 표현했을 때 두 가지 조건 중 한가지를 반드시 만족해야 합니다.
let num1 = 10 as never; // ✅
let num2 = 10 as unknown; // ✅
let num3 = 10 as string; // ❌
never
는 타입 계층도에서 가장 하위의 타입입니다.
따라서 첫 번째 문은 정상적으로 타입 단언이 가능합니다.
unknown
은 타입 계층도에서 가장 상위의 타입입니다.
따라서 두 번째 문도 정상적으로 타입 단언이 가능합니다.
number
(10 리터럴)은 string
타입의 슈퍼 타입도, 서브 타입도 아닙니다.
따라서 세 번째 문은 정상적으로 타입 단언이 불가능합니다.
let num3 = 10 as unknown as string;
위와 같이 타입 단언을 다중으로 사용할 수 있습니다.
10
을 unknown
타입으로 단언한 후 string
타입으로 단언했습니다.
unknown
은 타입 계층도에서 가장 상위 타입이기 때문에 10을 unknown
으로 타입 단언이 가능하고
string
은 unknwon
의 서브 타입이기 때문에 마찬가지로 타입 단언이 가능합니다.
하지만 이런 다중 타입 단언은 별로 좋지 못한 방식이기 때문에 어쩔 수 없이 다른 방법이 없는 경우에만 사용하는 것이 좋습니다.
let num4 = 10 as const;
// 10 Number Literal 타입으로 단언됨
let cat = {
name: "야옹이",
color: "yellow",
} as const;
// 모든 프로퍼티가 readonly를 갖도록 단언됨
const
로도 타입 단언이 가능합니다.
이는 그냥 const
로 변수를 선언한 것과 동일한 결과를 냅니다.
값 뒤에 !
느낌표를 붙여주어 값이 undefined
혹은 null
이 아님을 단언합니다.
type Post = {
title: string;
author?: string;
};
let post: Post = {
title: "게시글1",
};
const len: number = post.author!.length;