타입 단언이란 타입스크립트 컴파일러의 타입 추론을 무시하고 원하는 타입으로 강제로 지정할 때 사용한다. 그래서 자주 사용하면 안되고 꼭꼭 필요한 경우에만 사용해야한다.
type Person = {
name: string;
age: number
}
// 변수 person 은 빈객체이기 때문에 Person 타입으로 지정해줬을 경우 오류가 나게된다.
let person:Person = {}
빈 객체를 먼저 만들고 나서 나중에 값을 넣는 상황도 발생할 수 있는데, 이때 타입단언을 사용할 수 있다.
// 오류 케이스 1
// Person 타입을 지정해줬는데 필수 프로퍼티를 넣지 않은경우
let person:Person = {}
person.name = 'heesu';
person.age = 27;
// 오류 케이스 2
// person2 변수에 타입을 지정해주지않아 나중에 값을 넣으려고 할때
// 해당 변수의 타입이 빈객체이기 때문에 불가능 한 경우
let person2 = {}
person2.name = 'heesu';
person2.age = 27;
// 성공 케이스
// 타입 단언을 통해 빈 객체의 타입을 Person 으로 직접 지정해 줄 수 있다.
let person3 = {} as Person;
person3.name ='heesu';
person3.age = 30
초과 프로퍼티검사가 발동하여 에러가 나는 경우에도 타입단언을 사용할 수 있다.
type Dog = {
name: string,
color: string
}
let dog: Dog= {
name:'doooog',
color: 'white',
// 원래는 Dog 타입에 breed가 없기때문에 에러가 나지만
// 타입단언을 통해 에러가 나지 않도록 만들어 주었다.
breed: 'jindo'
} as Dog
A as B 일때
타입단언은 애초에 안전한 문법은 아니지만 1,2 번의 경우 서로 겹치는 부분이 어느정도 있기 때문에 아래 예제 num3(겹치는 부분이 아예 없는)의 경우보다는 훨씬 안전하다고 볼 수 있다.
// 타입단언 가능
// naver는 모든타입의 서브타입이기 때문에 A(number)가 B(never) 의 슈퍼타입이다.
let num1 = 10 as never;
// 타입단언 가능
// unknown타입은 모든타입의 슈퍼타입이다. A(number) 가 B(unknown)의 서브타입이다.
let num2 = 10 as unknown;
// 타입단언 불가 number타입은 string타입과 관련이 없다.
let num3 = 10 as string;
타입선언은 변수의 타입을 명시적으로 선언하는 행위이다.
dog 변수는 무조건 Dog 타입이여야 한다고 강제한다
let dog2: Dog = {
name: 'doooog',
color: 'white',
breed: 'jindo' // 오류발생 'breed'는 Dog 타입에 없음
}