
개발자가 해당 타입에 대해 확신이 있을 때 사용하는 타입 지정 방식
컴파일 시 해당 값을 지정한 타입으로 간주,
실제 구조가 맞는지까지는 검사하지 않음컴파일 에러는 발생하지 않지만,
런타임에서 예상치 못한 오류가 발생할 수 있음
type Person = {
name: string;
age: number;
};
let person: Person = {};
person.name = "";
person.age = 23;
위 코드는 에러를 발생시킨다.
Person 타입 정의에 보면 반드시 name, age 프로퍼티를 포함시켜야하기 때문이다.
개발자가 원하는 것은,
초기에 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
타입 단언은 다음과 같이 초과 프로퍼티 검사를 피할때에도 요긴하게 사용할 수 있다.
breed 라는 초과 프로퍼티가 존재하지만,
이 값을 Dog 타입으로 단언하여 초과 프로퍼티 검사를 피했다.
let num1 = 10 as never; // ✅
let num2 = 10 as unknown; // ✅
let num3 = 10 as string; // ❌ - 형제 관계
값 as 타입형식의 단언식을A as B로 표현했을 때,
아래의 두가지 조건중 한가지를 반드시 만족해야 한다.
- A가 B의 슈퍼타입
- A가 B의 서브타입
= 두 타입은 계층 관계
let num3 = 10 as unknown as string;
타입 단언은 다중으로도 가능하다.
다중 단언을 이용하면 단언을 다음과 같이 가능하도록 만들 수도 있다.
- number 타입의 값을 unknown 타입으로 단언
- unknown 타입의 값을 string 타입으로 단언
단순 눈속임이기 때문에 오류가 발생할 확률이 매우 높다.
let num4 = 10 as const;
// 10 Number Literal 타입으로 단언
let cat = {
name: "야옹이",
color: "yellow",
} as const;
특정 값을 const 타입으로 단언하면,
모든 프로퍼티가 readonly를 갖게 된다.즉, 프로퍼티 값을 수정할 수 없게 된다.
type Post = {
title: string;
author?: string;
};
let post: Post = {
title: "게시글1",
};
// if(post.author) {
// console.log(post.author);
// }
console.log(post!.author);
값 as 타입 형태를 따르지 않는 단언.
값 뒤에 느낌표(!) 를 붙여주면,
이 값이 undefined이거나 null이 아닐 것으로 단언할 수 있다.
라인 수가 줄어들 순 있겠지만 에러 핸들링을 하지 못할 듯 하다.
또한 라인 수가 줄어들었기 때문에 가독성이 좋아졌다고 생각할 수도 있는데
if 문이 있는게 더 읽기 편한 경우도 있다.
제 생각입니다.
const 로 객체 선언 vs const로 타입 단언 추가하기