
๐ ๊ฒน์น์ง ์๋ ์ฌ๋ฌ ํ์
์ ํ๋๋ก ํฉ์น ํ์
๋ณดํต ๋ฌธ์์ด ๋ฆฌํฐ๋ด ํ์
(tag, state ๋ฑ)์ ์ด์ฉํด ๊ฐ ํ์
์ ๊ตฌ๋ถํ๋ค.
์ฝ๊ฒ ๋งํ๋ฉด:
์ด 3๊ฐ๋ ์ ๋ ๊ฐ์ ์ฌ๋์ด ๋ ์ ์์ โ ์๋ก ๊ฒน์น์ง ์์
๊ทธ๋์ ๐ ์๋ก์(disjoint)
type Admin = {
tag: 'ADMIN';
}
๐ ์ด tag๊ฐ ๊ตฌ๋ถ์ ์ญํ (์๋ณ์)
์ฆ,
๐ ๊ทธ๋์ ํ์ ์ ์๋์ผ๋ก ์ขํ์ค (ํ์ ์ขํ๊ธฐ
โ ์์
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;
switch (user.tag) {
case 'ADMIN':
๐ ์ด ์๊ฐ TypeScript๋
๐ "์ ์๋ Admin์ด๋ค?" ๋ผ๊ณ ํ๋จ
๊ทธ๋์ โ ๊ฐ๋ฅ
user.kickCount
โ ๋ฐ๋ก ํ์ ๋จ์ธ ํ์ ์์
type AsyncTask = {
state: 'LOADING' | 'FAILED' | 'SUCCESS';
error?: { message: string };
}
๐ ๋ฌธ์ :
๊ทธ๋์ โ ์ด๋ฐ๊ฑฐ ํด์ผ๋จ
task.error?.message
๐ ์์ ํ์ง๋ ์๊ณ ๊ท์ฐฎ์
type FailedTask = {
state: 'FAILED';
error: { message: string };
}
๐ state๊ฐ FAILED๋ฉด
๐ error๋ ๋ฌด์กฐ๊ฑด ์์
๊ทธ๋์ โ ๊ฐ๋ฅ
task.error.message
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} ๋ฐฉ๋ฌธ`);
break;
}
}
๐ tag ๊ฐ์ผ๋ก ํ์ ์ด ์๋์ผ๋ก ์ขํ์ง๋ค.
type AsyncTask = {
state: 'LOADING' | 'FAILED' | 'SUCCESS';
error?: { message: string };
response?: { data: string };
};
โ ๋ฌธ์ ์
type LoadingTask = {
state: 'LOADING';
};
type FailedTask = {
state: 'FAILED';
error: { message: string };
};
type SuccessTask = {
state: 'SUCCESS';
response: { data: string };
};
type AsyncTask = LoadingTask | FailedTask | SuccessTask;
function processResult(task: AsyncTask) {
switch (task.state) {
case 'LOADING':
console.log('๋ก๋ฉ ์ค');
break;
case 'FAILED':
console.log(task.error.message);
break;
case 'SUCCESS':
console.log(task.response.data);
break;
}
}
โ
ํ์
์๋ ์ขํ๊ธฐ ๊ฐ๋ฅ
โ
๋ถํ์ํ ?, ! ์ ๊ฑฐ
โ
์ฝ๋ ์์ ์ฑ ์ฆ๊ฐ
โ
๊ฐ๋
์ฑ ์ข์์ง
๐ซ ํฐ์ผ ๋น์
๐ ํฐ์ผ ์ข
๋ฅ(tag) ๋ณด๋ฉด
๐ ์ด๋ค ๊ธฐ๋ฅ ์๋์ง ๋ฐ๋ก ์ ์ ์์
โ ์ค์ 1
console.log(
{user.name})
๐ โ ํ๋ฆผ
๐ ${} ์จ์ผ๋จ
console.log(
${user.name})
โ ์ค์ 2
error?
๐ ๋ฌด์กฐ๊ฑด ์๋ ๊ฐ์ธ๋ฐ optional๋ก ๋ง๋ฆ โ ์๋ชป๋ ์ค๊ณ
โ ์ค์ 3
if ("error" in task)
๐ ๊ฐ๋ฅ์ ํ์ง๋ง
๐ โ tag/state ์ฐ๋๊ฒ ํจ์ฌ ๊น๋ํ๊ณ ํ์ค์
๐ "tag ๊ฐ์ ๊ฐ์ผ๋ก ํ์ ์ ๊ตฌ๋ถํด์ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ํจํด"