?으로 표기)let person : {id : number, name? : string};// 타입
type TUser = { id: number; name: string };
type TUser2 = { id: number; name: string; addr?: string };
const Person = { id: 2, name: "kim", addr: "seoul" };
// 객체
const kim: TUser = { id: 2, name: "kim", addr: "seoul" }; // Error : freshnessfresh off 방법 : 강제로 타입단언, 이미 선언된 객체를 변수에 대입
타입단언 : 컴파일러에게 내가 이 타입에 대해 정확히 알고 있다고 알려주는 방법
// <타입>객체 or 객체 as 타입
const kim: TUser = { id: 2, name: "kim", addr: "seoul" } as TUser; // 통과 : 타입단언
이미 선언된 객체를 변수에 대입
const kim: TUser = Person; // 통과 : 변수대입
// 객체배열
const arr: TUser[] = [{ id: 1, name: "kim", addr: "seoul" }]; // Error : freshness
const arr: TUser[] = [{ id: 2, name: "kim", addr: "seoul" }, Person]; // 통과 : 변수대입
const tuple: [TUser, TUser] = [{ id: 2, name: "kim", addr: "seoul" }, Person]; // Error : 튜플은 각각을 검사하므로 에러
// 객체튜플
const tuple: [TUser, TUser] = [{ id: 3, name: "kim", addr: "seoul" } as TUser, Person];
const Animal = { id: 2, name: "dog", addr: "seoul" };
const tuple: [TUser, TUser] = [Person, Animal];
in 또는 판별값 사용한다.// in 사용
if ("type" in person) {
poem.pages;
} else {
poem.rhymes;
}
// 리터럴 판별값 사용 (판별된 유니언(내로잉) - 판별값 : page, 판별자 : poem.type === "pages")
if (poem.type === "pages") {
// poem.type : 리터럴 타입을 갖는 공통 속성으로 다른 판별값을 가짐
poem.pages;
} else {
poem.rhymes;
}