๐ฅ ์ง๋
3. ํ์ ์คํฌ๋ฆฝํธ ์ดํดํ๊ธฐ (9/9)
- ํ์ ๋จ์ธ
- ํ์ ์ขํ๊ธฐ
- ์๋ก์ ์ ๋์จ ํ์
๐ฅ ์์ฝ
ํ์ ๋จ์ธ (Type Assertion)
// ํ์
์คํฌ๋ฆฝํธ์ ๋์ ์ ๊น ๊ฐ๋ ค์ ๋ด๊ฐ ์์ฑํ ํ์
์ด๋ผ๊ณ ๋ฏฟ๋๋ก ๋ง๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ํํ ์ ์๋ค
type Person = {
name: string;
age: number;
};
let person = {} as Person;
person.name = "Julie";
person.age = 24;
type Dog = {
name: string;
color: string;
};
let dog = {
name: "kimbab",
color: "white",
breed: "jindo",
} as Dog;
/**
* ํ์
๋จ์ธ์ ๊ท์น
* ๋จ์ธ์ : """ ๊ฐ as ๋จ์ธ """"
* A as B
* -> A๊ฐ B์ ์ํผ ํ์
์ด๊ฑฐ๋
* -> A๊ฐ B์ ์๋ธ ํ์
์ด์ด์ผ ํจ.
*
*/
let num1 = 10 as never;
let num2 = 10 as unknown as string;
- const ๋จ์ธ
let num4 = 10 as const;
let cat = {
name: "์ผ์น์ด",
color: "yellow",
} as const;
// cat.name = "";
// --> cannot assign to 'name' because it is a readonly property.
// const ์ ์ธ์ผ๋ก readonly ํ๋กํผํฐ๋ฅผ ๋ง๋ค ์ ์์
- Non Null ๋จ์ธ
type Post = {
title: string;
author?: string;
}
let post: Post = {
title: "๊ฒ์๊ธ",
author: "์์ง์",
}
const len: number = post.author!.length;
// const len:number = post.author?.length;
// --> ?๋ก ์ธํด optional chaining์ด ์ผ์ด๋๋๋ฐ, type 'number | undefined' ์ผ ๊ฒฝ์ฐ number ์ ์ฉ ๋ฉ์๋ length๋ฅผ undefined์ผ ์๋ ์๋ ๋ณ์์ ์ฌ์ฉํ ์ ์๋ค๋ ์๋ฏธ
// ! ๋ก ํ์ธ์ ์ค์ผํ๋ค. !์ฌ์ฉ์ ์ด๊ฑด null์ด๋ undefined๊ฐ ์ ๋ ์๋๊ณ ๊ฐ์ด ์๋ค๋ ๋จ์ธ์ ํ๋ ๊ฒ
ํ์ ์ขํ๊ธฐ (Type Narrowing)
/**
* ์กฐ๊ฑด๋ฌธ ๋ฑ์ ์ด์ฉํด ๋์ ํ์
-> ์ข์ ํ์
์ผ๋ก ์ขํ
* ํ์
์ ์ํฉ์ ๋ฐ๋ผ ์ขํ๋ ๋ฐฉ๋ฒ์ ์ด์ผ๊ธฐ ํ ๊ฒ
*/
type Person = {
name: string;
age: number;
}
// value => number : toFixed
// value => string : toUpperCase
// value => Date : getTime
// value => Person : name์ age์ด ์
๋๋ค.
function func(value: number | string | Date | null | Person) {
// if์ typeof์ฒ๋ผ type narrowing ํด์ฃผ๋ ํํ์์ Type Guard๋ผ๊ณ ํจ
if (typeof value === "number") {
console.log(value.toFixed());
} else if (typeof value === "string") {
console.log(value.toUpperCase());
} else if (value instanceof Date) {
console.log(value.getTime());
} else if (value && "age" in value) {
console.log(`${value.name}์ ${value.age}์ด ์
๋๋ค.`);
}
}
// if
// typeof
// instanceof
// in
์๋ก์ ์ ๋์จ ํ์
/**
* ๊ต์งํฉ์ด ์๋ ํ์
๋ค๋ก๋ง ๋ง๋ ์ ๋์จ ํ์
*/
type Admin = {
tag: "ADMIN";
name: string;
kickCount: number;
};
type Member = {
tag: "MEMBER";
name: string;
point: number;
};
type Guest = {
tag: "GUEST";
name: string;
visitCount: number;
};
type User = Admin | Member | Guest;
// tag์ ํ์
์ string literal type์ผ๋ก ๋ง๋ค์ด์ค์ผ๋ก์ ๊ต์งํฉ์ด ์ ๋ ๋์ง ์๋ ๊ด๊ณ๊ฐ ๋๋ฏ๋ก Admin, Member, Guest๊ฐ ์๋ก์ ๊ด๊ณ๊ฐ ๋๋ค
// Admin => {name}๋, ํ์ฌ๊น์ง {kickCount}๋ช
๊ฐํดํ์์ต๋๋ค.
// Member => {name}๋, ํ์ฌ๊น์ง {point} ๋ชจ์์ต๋๋ค.
// Guest => {name}๋, ํ์ฌ๊น์ง {visitCount}๋ฒ ์ค์
จ์ต๋๋ค.
function login(user: User) {
switch (user.tag) {
case "ADMIN": {
console.log(
`${user.name}๋, ํ์ฌ๊น์ง ${user.kickCount}๋ช
๊น
ํดํ์์ต๋๋ค.`
);
break;
}
case "MEMBER": {
console.log(`${user.name}๋, ํ์ฌ๊น์ง ${user.point} ๋ชจ์์ต๋๋ค.`);
break;
}
case "GUEST": {
console.log(
`${user.name}๋, ํ์ฌ๊น์ง ${user.visitCount}๋ฒ ์ค์
จ์ต๋๋ค.`
);
}
}
}
๐ค ๊ณผ์
Q1. ํ์ ๋จ์ธ์ ์ด์ฉํด person ๋ณ์์ ๋น ๊ฐ์ฒด๋ฅผ ํ ๋นํ์ธ์.
type Person = {
name: string;
age: number;
};
let person: Person = {};
โก๏ธ
type Person = {
name: string;
age: number;
};
let person = {} as Person;
Q2. ํ์ ๋จ์ธ์ ์ด์ฉํด ํจ์ ํธ์ถ์์์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ์ธ์.
let value = 10;
giveMe10(value);
function giveMe10(value: 10) {
return value;
}
โก๏ธ
let value = 10 as const;
giveMe10(value);
function giveMe10(value: 10) {
return value;
}
Quiz 3.
CompanyMember ํ์ ์ Boss์ Employee์ ์๋ก์ ์ ๋์จ ํ์ ์ผ๋ก ์ ์ํ์ธ์.
type Boss = {
car: string;
};
type Employee = {
salary: number;
};
type CompanyMember = Employee | Boss;
/* [Test] ์ฌ๊ธฐ๋ถํฐ๋ ์ ๋ต์ ์ฒดํฌํ๊ธฐ ์ํ ์ฉ๋๋ก ์์ ํ์ง ์์ต๋๋ค */
function test(companyMember: CompanyMember) {
if (companyMember.tag === "BOSS") {
console.log("์ฌ์ฅ๋ ๋ ์ฐจ ๋ฐ๊ฟจ๋ค : ", companyMember.car);
} else if (companyMember.tag === "EMPLOYEE") {
console.log("์์ง๋ ์๊ธ์ : ", companyMember.salary);
}
}
โก๏ธ
type Boss = {
type: "Boss";
car: string;
};
type Employee = {
type: "Employee"
salary: number;
};
type CompanyMember = Employee | Boss;