다음과 같은 코드가 있다고 가정
type Person = {
name: string;
age: number;
};
let person: Person = {};
person.name = "";
person.age = 23;→ 변수 person은 Person 타입으로 정의 되어있지만 초기화 할 때에는 빈 객체를 넣어두고 싶다고 가정.
→ TS에서는 이런 경우를 허용하지 않음…
이럴때는 다음과 같이 빈 객체를 Person 타입이라고 TS에게 단언해주면 됨
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→ bread라는 초과 프로퍼티가 존재하지만 이 값을 Dog 타입으로 단언해서 초과 프로퍼티 검사를 피함
갑 as 타입 형식의 단언식을 A as B로 표현했을 때 아래의 두가지 조건중 한가지를 반드시 만족해야 함
- A가 B의 슈퍼타입이다
- A가 B의 서브타입이다.
ex.
let num1 = 10 as never; // ✅
let num2 = 10 as unknown; // ✅
let num3 = 10 as string; // ❌타입 단언은 다중으로 가능함. 다중 단언을 이용하면 앞서 살펴본 예제 중 불가능했던 단언을 다음과 같이 가능하도록 만들 수 있음
let num3 = 10 as unknown as string;이를 순서대로 살펴보면
- number 타입의 값을 unknown 타입으로 단언함
- unknown 타입의 값을 string 타입으로 단언함
이렇든 중간 값을 unknown 타입으로 단언하면 unknown 타입은 모든 타입의 슈퍼타입이므로 모든 타입으로 또 다시 단언하는게 가능함
하지만 이렇게 단언하는 것은 좋지 않음… 타입 단언은 실제로 그 값을 해당 타입의 값으로 바꾸는 것이 아니라 단순 눈속임에 불과함. 따라서 이렇게 값을 슈퍼-서브 관계를 갖지 않는 타입으로 단언하면 오류가 발생할 확률이 매우 높아짐…
따라서 어쩔 수 없이 필요한 상황에서만 이용하기를 권장함
타입 단언때에만 사용할 수 있는 const 타입이 존재함. 특정 값을 const 타입으로 단언하면 마치 변수를 const로 선언한 것과 비슷하게 타입이 변경됨
let num4 = 10 as const;
// 10 Number Literal 타입으로 단언됨
let cat = {
name: "야옹이",
color: "yellow",
} as const;
// 모든 프로퍼티가 readonly를 갖도록 단언됨Non Null 단언은 지금까지 살펴본 값 as 타입 형태를 따르지 않는 단언임. 값 뒤에 느낌표 !를 붙여주면 이 값이 undefined이거나 null이 아닐것으로 단언할 수 있음
type Post = {
title: string;
author?: string;
};
let post: Post = {
title: "게시글1",
};
const len: number = post.author!.length;