아래의 경우 의도와 다르게 변수의 타입이 추론됨
person
이라는 변수에 나중에 프로퍼티 값을 초기화하고 싶은 경우type Person = {
name: string;
age: number;
};
let person: Person = {}; // ❌ Person타입에 맞지 않음
person.name = "이정환";
person.age = 27;
type Person = {
name: string;
age: number;
};
let person: Person = {};
person.name = "이정환"; // ❌
person.age = 27; // ❌
// 처음 추론된 타입은 빈 객체 → 빈 객체로 있어야 함
→ 해결방법 : 타입 단언
(type assertion)
type Person = {
name: string;
age: number;
};
// as Person → 이 타입으로 간주하라고 알려줌
let person: Person = {} as Person;
person.name = "이정환";
person.age = 27;
type Dog = {
name: string;
color: string;
};
// 변수 초기화 값으로 객체 리터럴 사용 경우
let dog: Dog = {
name: "돌돌이",
color: "brown",
breed: "진도", // ❌오류
};
→ 타입 단언을 이용하여 해결
type Dog = {
name: string;
color: string;
};
let dog = {
name: "돌돌이",
color: "brown",
breed: "진도",
} as Dog;
값 as 단언
의 단언식 에서,
A as B
의 형태일 때
A
가 B
의 슈퍼타입 이거나let num1 = 10 as never;
A
가 B
의 서브타입 인 경우에만 가능하다.let num2 = 10 as unknown;
let num3 = 10 as string; // ❌
※ Hack: 오류가 안나게 하는 방법 ※
다중 단언으로 단언이 안되는 타입도 단언을 할 수 있다.
(사용을 권장하지 않음.)let num3 = 10 as unknown as string;
const로 선언한 것과 동일한 효과를 냄
let num4 = 10 as const;
readonly
)let cat = {
name: "야옹이",
color: "yellow",
} as const;
→ 프로퍼티의 값 수정할 수 없게 됨
어떤 값이 null 이거나 undefined가 아니라고 ts컴파일러에게 알려줌
// 작성자가 익명이 가능한 경우
type Post = {
title: string;
author?: string;
};
// 게시글 예시
let post: Post = {
title: "게시글1",
author: "이정환",
};
number
타입을 지정하는 경우// 게시글 작성자 이름의 길이를 가져오는 기능
const len: number = post.author?.length; // ❌
→ 옵셔널 체이닝을 이용하면 원하는 동작을 수행할 수 없음
→ Non Null 단언 사용
참고: 옵셔널 체이닝
const len = post.author?.length;
author
에?
를 붙여서author
프로퍼티가 없으면 값 전체가undefined
가 되도록 함
const len: number = post.author!.length; // ✅
author
뒤에 !
를 붙여서 post.author
값은 무조건 string
타입이 올거라고 말함 (undefined
나 null
이 아니라고 해줌)