03. ๐ก๏ธ ํ์ ์คํฌ๋ฆฝํธ ๊ณ ๊ธ ํ์ ์ค๊ณ์ ์ถ๋ก
๐ ๊ฐ์
๋จ์ํ ํ์ ์ ์ธ์ ๋์ด, ์กฐ๊ฑด๋ถ ํ์ ๊ณผ ์ ๋ค๋ฆญ์ ํ์ฉํ ๊ณ ๋๋ก ์ ์ฐํ๊ณ ์์ ํ ํ์ ์ค๊ณ ๋ฅ๋ ฅ์ ๋ฐฐ์ํฉ๋๋ค.
๐ ์ด ๋ฉด์ ํญ๋ชฉ์ ๋ชฉํ
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 20๋ถ (ํต์ฌ ์์ฝ: 10๋ถ)
๐บ๏ธ ์ด ์ฑํฐ์ ํ๋ฆ
[๊ฐ๋
์ฌ์ ] โ [์ง๋ฌธ 1: ์ปดํฌ๋ํธ ๋คํ์ฑ ์ค๊ณ] โ [์ง๋ฌธ 2: ์กฐ๊ฑด๋ถ ํ์
& infer] โ [์ฐ๊ด ๋ณํ ์ง๋ฌธ]
๐ฏ ์ด ์ฑํฐ๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ์ ๋์ธ๊ณผ ๊ต์ฐจ ํ์ ์ ํ์ฉํด ๊ฒฐํฉ๋๊ฐ ๋ฎ๊ณ ์์ ํ Props๋ฅผ ์ค๊ณํ ์ ์์ต๋๋ค.
Conditional Types์infer๋ฅผ ์ฌ์ฉํด ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์ ์ ํธ๋ฆฌํฐ ํ์ ์ ๊ตฌํํฉ๋๋ค.any๋์unknown๊ณผsatisfies๋ฅผ ์จ์ผ ํ๋ ์ํฉ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ค๋ช ํฉ๋๋ค.
๐ ํต์ฌ ๊ฐ๋ ์ฌ์ (Concept Glossary)
1. ์ ๋ค๋ฆญ (Generics)
ํ์ ์ ๋ง์น ํจ์์ ํ๋ผ๋ฏธํฐ์ฒ๋ผ ์ฌ์ฉํ๋ ๊ธฐ์ ์ ๋๋ค. ์ ์ธ ์์ ์ด ์๋๋ผ ์ฌ์ฉ ์์ ์ ํ์ ์ ํ์ ํ๋ฏ๋ก, ์ฌ์ฌ์ฉ์ฑ์ด ๋์ผ๋ฉด์๋ ํ์ ์ ๋ณด๋ฅผ ์์ง ์๋ ์ค๊ณ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
2. ์กฐ๊ฑด๋ถ ํ์ (Conditional Types)
T extends U ? X : Y ํํ๋ก, ํ์
์์คํ
๋ด์์ '์กฐ๊ฑด๋ฌธ'์ ์คํํ๋ ๊ธฐ์ ์
๋๋ค. ์
๋ ฅ ํ์
์ ๋ฐ๋ผ ๊ฒฐ๊ณผ ํ์
์ ๋์ ์ผ๋ก ๊ฒฐ์ ํ ๋ ํ์์ ์
๋๋ค.
3. infer ํค์๋
์กฐ๊ฑด๋ถ ํ์ ๋ด์์ ์ถ๋ก ํ ํ์ ์ ์ด๋ฆ์ ๋ถ์ด๋ ๋ง๋ฒ ๊ฐ์ ํค์๋์ ๋๋ค. ์๋ฅผ ๋ค์ด, ํจ์์ ๋ฆฌํด ํ์ ์ด๋ ๋ฐฐ์ด์ ์์ ํ์ ์ ๋ฐํ์์ด ์๋ ํ์ ์์ง ๋จ์์ ๋ฝ์๋ผ ๋ ์ฌ์ฉํฉ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋! '์์๋ค ํตํฉ ๋ฒํผ' ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋๋ฐ,
<a>ํ๊ทธ๋ก ์ฐ์ผ ๋๋<button>์ผ๋ก ์ฐ์ผ ๋ Props ํ์ ์ ๋ค๋ฅด๊ฒ ์ฃผ๊ธฐ๊ฐ ๋๋ฌด ํ๋ค์ด์. ๊ทธ๋ฅany๋ฐ์ผ๋ฉด ์ ๋ ๊น์? ๐ " - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋,
any๋ฅผ ๋ฐ๋ ์๊ฐ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐ๋ ์๋ฏธ๊ฐ ์ฌ๋ผ์ง๋๋ค. ๊ทธ๊ฑด '์์ ๋ฒจํธ๋ฅผ ์๋ฅด๊ณ ์ด์ ํ๊ฒ ๋ค'๋ ์๋ฆฌ์์. ์ ๋์ธ ํ์ ๊ณผ ์ ๋ค๋ฆญ๋ง ์์ผ๋ฉด ํจ์ฌ ์ฐ์ํ๊ฒ ํด๊ฒฐํ ์ ์๋๋ฐ ๋ง์ด์ฃ . ๋ฉด์ ์์ ์ด๋ฐ '์ค๊ณ ๊ณ ๋ฏผ'์ ๋ณด์ฌ์ค์ผ ์๋์ด๋ก ์ธ์ ๋ฐ๋ ๊ฒ๋๋ค."
Q1. ์ ๋์ธ ํ์ ๊ณผ ๊ต์ฐจ ํ์ ์ ํ์ฉํ์ฌ ์ปดํฌ๋ํธ์ props ๋คํ์ฑ์ ์์ ํ๊ฒ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํด ๋ณด์ธ์.
๐ฏ ์ถ์ ์๋
๋จ์ํ interface๋ฅผ ์ ์ํ๋ ์์ค์ ๋์ด, ์๋ก ๋ฐฐํ์ ์ธ ์์ฑ ๊ด๊ณ๋ฅผ ํ์
์ผ๋ก ๊ฐ์ ํ ์ ์๋์ง(Discriminated Unions) ์ค๊ณ ์ญ๋์ ํ์ธํฉ๋๋ค.
๐ฃ ์์ฒ ์ด์ Naive ๊ตฌํ (Bad Case)
์์ฒ ์ด๋ ๋ชจ๋ ์์ฑ์ ์ต์
๋(?)๋ก ๋ง๋ค์ด์ ๋ฐ์ํ ์ ์๋ ๋ฐํ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ์ง ๋ชปํ์ต๋๋ค.
// ๐ฃ ์์ฒ : "์๋ ๊ฒ๋ง ์ฐ๋ฉด ๋๋๊น ๋ค ์ต์
๋๋ก ํ๋ฉด ํธํ๊ฒ ์ฃ ?"
interface ButtonProps {
label: string;
onClick?: () => void; // ๋ฒํผ์ผ ๋ ํ์
href?: string; // ๋งํฌ์ผ ๋ ํ์
}
// โ ๏ธ ๋ฒ๊ทธ ๋ฐ์: href๊ฐ ์๋๋ฐ ๋งํฌ๋ก ๋์ํ๊ฑฐ๋, onClick์ด ์๋๋ฐ ๋ฒํผ์ธ ๊ฒฝ์ฐ๋ฅผ ๋ง์ง ๋ชปํจ
<Button label="ํด๋ฆญ" /> // ์๋ฌด ๋์ ์ ํจ๐ฆ ์ํธ์ ํฉํญ ์กฐ์ธ
"์์ฒ ๋, ์ด๋ ๊ฒ ์ง๋ฉด ์ฌ์ฉ์๋ ๋ฌธ์๋ฅผ ๋ค ์ฝ์ด์ผ๋ง ์ด ์ปดํฌ๋ํธ๋ฅผ ์ธ ์ ์์ด์. ํ์ ์์คํ ์ด '์ด๊ฑด ๋ฒํผ์ด๋๊น href๋ ๋ฃ์ง ๋ง!'๋ผ๊ณ ๋งํด์ค์ผ์ฃ . ์ด๊ฒ์ด ๋ฐ๋ก ๋์ ๋คํ์ฑ์ ํต์ฌ์ ๋๋ค."
๐ฆ ์ํธ์ ์ํคํ ์ฒ ๊ฐ์ด๋ (Good Case)
์ํธ ๋ฆฌ๋๋ Discriminated Unions๋ฅผ ์ฌ์ฉํ์ฌ ํ์
์ด ์ฌ์ฉ์๋ฅผ ๊ฐ์ด๋ํ๊ฒ ๋ง๋ญ๋๋ค.
// ๐ฆ ์ํธ: "ํ์
์ด ์ค์ค๋ก์ ์ฉ๋๋ฅผ ์ฆ๋ช
ํ๊ฒ ํ์ธ์."
type BaseProps = { label: string };
type ButtonProps = BaseProps & {
as: 'button';
onClick: () => void; // ํ์
href?: never; // ์ ๋ ์ค๋ฉด ์ ๋จ
};
type LinkProps = BaseProps & {
as: 'a';
href: string; // ํ์
onClick?: never;
};
type PolymorphicProps = ButtonProps | LinkProps;
function CustomButton(props: PolymorphicProps) {
// ... ๊ตฌํ ๋ก์ง
}
// โ
์ฑ๊ณต: as๊ฐ 'a'๋ฉด ์๋ ์์ฑ์ผ๋ก href๋ฅผ ์๊ตฌํจ
<CustomButton as="a" href="/home" label="ํ์ผ๋ก" />๐ ๋ ๋ฒจ๋ณ ๋ต๋ณ ๊ฐ์ด๋ (Self-Check)
- Level 1 (Junior): "์ ๋์ธ์
|๊ธฐํธ๋ก ์ฌ๋ฌ ํ์ ์ค ํ๋๋ฅผ ์ ํํ๋ ๊ฒ์ด๊ณ , ๊ต์ฐจ๋&๋ก ํ์ ๋ค์ ํฉ์น๋ ๊ฒ์ ๋๋ค." - Level 2 (Senior): "์ ๋์ธ ํ์
์ ํ์ฉํ
Discriminated Union(์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ)ํจํด์ ์ค๋ช ํฉ๋๋ค. ๊ณตํต ์์ฑ(tag, as ๋ฑ)์ ๋ฆฌํฐ๋ด ํ์ ์ผ๋ก ๋์ด ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ขํ ์ ์๊ฒ ์ค๊ณํ๋ ์ค๋ฌด ์ฌ๋ก๋ฅผ ์ ์ํฉ๋๋ค." - Level 3 (Specialist): "์ ๋ค๋ฆญ์ ํ์ฉํ
Polymorphic Component์ค๊ณ ๊ธฐ๋ฒ์ ์ค๋ช ํฉ๋๋ค. HTML ํ๊ทธ ์ข ๋ฅ์ ๋ฐ๋ผ ์๋์ผ๋กIntrinsicElementsํ์ ์ ๋งคํํด์ฃผ์ด, ์ปค์คํ ์ปดํฌ๋ํธ๊ฐ ๋ธ๋ผ์ฐ์ ํ์ค ์์ฑ๊น์ง ์๋ฒฝํ๊ฒ ์ง์ํ๋๋ก ๋ง๋๋ ๊ณ ๋ํ๋ ์ค๊ณ๋ฅผ ์ ์ํฉ๋๋ค."
Q2. ์กฐ๊ฑด๋ถ ํ์ (Conditional Types)๊ณผ infer ํค์๋๋ฅผ ํ์ฉํ์ฌ ๋ณต์กํ ์ ํธ๋ฆฌํฐ ํ์ ์ ์ง์ ๊ตฌํํด ๋ณธ ๊ฒฝํ์ ์ค๋ช ํด ๋ณด์ธ์.
๐ฏ ์ถ์ ์๋
ํ์ ์คํฌ๋ฆฝํธ ์์ง์ ๋ด๋ถ ๋์ ์๋ฆฌ๋ฅผ ๊น์ด ์ดํดํ๊ณ ์๋์ง, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์ ๋ณต์กํ ํ์ ์ ์ ์ดํ ์ ์๋ 'ํ์ ์์ง๋์ด๋ง' ๋ฅ๋ ฅ์ ํ์ธํฉ๋๋ค.
๐ฃ ์์ฒ ์ด์ Naive ๊ตฌํ (Bad Case)
์์ฒ ์ด๋ ํจ์์ ๋ฆฌํด ํ์ ์ ์์๋ด๊ธฐ ์ํด ๋งค๋ฒ ์๋์ผ๋ก ํ์ ์ ์ ์ธํ๊ณ ์์ต๋๋ค.
// ๐ฃ ์์ฒ : "ํจ์๋ฅผ ์์ ํ๋ฉด ๋ฆฌํด ํ์
๋ ์๋์ผ๋ก ๊ณ ์ณ์ผ ํด์ ๋ฒ๊ฑฐ๋ก์์..."
function getUser() {
return { id: 1, name: '์์ฒ ' };
}
type User = { id: number; name: string }; // โ ๏ธ ํจ์๊ฐ ๋ฐ๋๋ฉด ์ฌ๊ธฐ๋ ๊ณ ์ณ์ผ ํจ (์ฑํฌ ๋ฏธ์ค ๊ฐ๋ฅ์ฑ)๐ฆ ์ํธ์ ํฉํญ ์กฐ์ธ
"์์ฒ ๋, ํ์ ์คํฌ๋ฆฝํธ์๊ฒ ์ง์ ๋ฌผ์ด๋ณด์ธ์.infer๋ฅผ ์ฐ๋ฉด ํจ์์ ๋ฐฐ๋ฅผ ๊ฐ๋ผ(?) ๋ฆฌํด ํ์ ์ ์ง์ ๊บผ๋ด์ฌ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฐ๋ReturnType<T>ํ๋์จ์ด๊ฐ ๋ฐ๋ก ์ด๋ ๊ฒ ์๊ฒผ์ฃ ."
๐ฆ ์ํธ์ ์ํคํ ์ฒ ๊ฐ์ด๋ (Good Case)
์ํธ ๋ฆฌ๋๊ฐ infer๋ฅผ ์ฌ์ฉํด ์ง์ GetReturnType ์ ํธ๋ฆฌํฐ๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ๋ณด์ฌ์ค๋๋ค.
// ๐ฆ ์ํธ: "ํ์
์์ง์ด ์ค์ค๋ก ์ถ๋ก ํ๊ฒ ๋ง๋์ธ์."
// T๊ฐ ํจ์๋ผ๋ฉด, ๊ทธ ๋ฆฌํด ํ์
์ R๋ก ์ถ๋ก (infer)ํด์ ๋ฐํํ๋ผ!
type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function getBoardAction() {
return { type: 'CREATE_POST', payload: '์ค๋๋ ์ฝ๋ฉ!' };
}
// โ
์ด์ getBoardAction์ด ๋ฐ๋์ด๋ ์๋์ผ๋ก ์ถ๋ก ๋จ!
type Action = MyReturnType<typeof getBoardAction>;๐ ๋ ๋ฒจ๋ณ ๋ต๋ณ ๊ฐ์ด๋ (Self-Check)
- Level 1 (Junior): "์กฐ๊ฑด๋ถ ํ์
์ ํ์
ํ ์ผํญ ์ฐ์ฐ์๊ณ ,
infer๋ ํ์ ์ ์ถ๋ก ํ ๋ ์๋๋ค." - Level 2 (Senior): "
infer๊ฐ ์ค์งextends์ ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ์ ์ฝ์ ์๊ณ ์์ผ๋ฉฐ,Promise์ ๋ด๋ถ ๊ฐ ํ์ ์ ๊บผ๋ด๊ฑฐ๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์ ํ์ ์ ์ถ์ถํ๋ ๊ตฌ์ฒด์ ์ธ ์์๋ฅผ ๋ค์ด ์ค๋ช ํฉ๋๋ค." - Level 3 (Specialist): "๋ถ์ฐ ์กฐ๊ฑด๋ถ ํ์
(Distributive Conditional Types)์ ํน์ฑ์ ์ดํดํ๊ณ , ์ ๋์ธ ํ์
์ด ๋ค์ด์์ ๋ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ค๋ช
ํฉ๋๋ค. ์ด๋ฅผ ํ์ฉํด ํน์ ์์ฑ๋ง ์ ๊ฑฐํ๋
Omit์ด๋Exclude๊ฐ์ ์ ํธ๋ฆฌํฐ ํ์ ์ด ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์ฌ๊ท์ ์ผ๋ก ๋์ํ๋์ง ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถ์ํฉ๋๋ค."
๐ ์ค์ ๋ณํ ์ง๋ฌธ (Related Variations)
Q9. ํ์ ์คํฌ๋ฆฝํธ์์ ์ปดํ์ผ ํ์์ ์ ๋ค๋ฆญ(Generics)์ ํ์ ์ถ๋ก ๋ฉ์ปค๋์ฆ์ด ์ด๋ป๊ฒ ๋์ํ๋์?
- ๐ฏ ์ถ์ ์๋: ์ ๋ค๋ฆญ์ด ๋จ์ํ ํ์ ์ ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ ํ๋ ์์ค์ ๋์ด, ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ดํฐ์ ํ๋ฆ์ผ๋ก๋ถํฐ ํ์ ์ ์ญ์ถ๋ก (Inference)ํ๋์ง ์ฌ๋ ์๊ฒ ํ์ ํฉ๋๋ค.
- ๐ก ํต์ฌ ์๋ฆฌ & ๋ต๋ณ: ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๋ ํจ์์ ์ ๋ฌ๋ ์ค์ ์ธ์(Value)์ ํ์
์ ๋ณด๊ณ , ๊ทธ์ ๋งค์นญ๋ ์ ๋ค๋ฆญ ํ์
๋ณ์(
T๋ฑ)๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ฅผ 'ํ์ ์ธ์ ์ถ๋ก '์ด๋ผ ํฉ๋๋ค. ๋ง์ฝ ์ธ์๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ๊ฐ ์ธ์์ ๊ณตํต ๋ถ๋ชจ(LUB, Least Upper Bound)๋ฅผ ์ฐพ์ ํ์ ์ ์ขํ๋๋ค. ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ํ์ ์ ์ ์ง ์์๋ ๋๋ ์ด์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ํํฅ์(Top-down) ๋ฐ ์ํฅ์(Bottom-up) ์ถ๋ก ์ ๋ณํํ์ฌ ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ์ฐพ์๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๋ฉ์ปค๋์ฆ์ ์ดํดํ๋ฉด ๋ถํ์ํ ํ์ ๋จ์ธ ์์ด๋ ์์ ํ ์ฝ๋๋ฅผ ์งค ์ ์์ต๋๋ค.
Q23. unknown ํ์ ์ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์บ์คํ ํ๋ ์ ๋ต์ ์ค๋ช ํด ๋ณด์ธ์.
- ๐ฏ ์ถ์ ์๋:
any๋ผ๋ ์นํธํค ๋์ , ํ์ ์์คํ ์ ์กด์คํ๋ฉฐ ๋ถํ์คํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ '์์ ํ ๋ฐฉ์ด ํ๋ก๊ทธ๋๋ฐ' ์ญ๋์ ํ์ธํฉ๋๋ค. - ๐ก ํต์ฌ ์๋ฆฌ & ๋ต๋ณ:
unknown์any์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ๊ฐ์ ๋ฐ์ ์ ์๋ '์ต์์ ํ์ '์ด์ง๋ง,any์ ๊ฒฐ์ ์ ์ธ ์ฐจ์ด๊ฐ ์์ต๋๋ค.unknownํ์ ์ ๋ณ์๋ ๊ทธ ์์ ๋ฌด์์ด ๋ค์ด์๋์ง ํ์ ๊ฐ๋(typeof,instanceof๋ฑ)๋ก ๋ช ํํ ๊ฒ์ฆํ๊ธฐ ์ ๊น์ง๋ ์ด๋ ํ ์์ฑ ์ ๊ทผ์ด๋ ์ฐ์ฐ๋ ํ์ฉ๋์ง ์์ต๋๋ค. ์ฆ, ๊ฐ๋ฐ์์๊ฒ "์ด ๊ฐ์ ์ํํ ์ ์์ผ๋ ๋จผ์ ํ์ธํ๊ณ ์จ!"๋ผ๊ณ ์ปดํ์ผ๋ฌ๊ฐ ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค. ์ธ๋ถ API ์๋ต์ด๋ ์ฌ์ฉ์ ์ ๋ ฅ์ฒ๋ผ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ๋ ๋ฐ๋์unknown์ผ๋ก ์ ์ธํ๊ณ ๋ฐํ์ ์ฒดํฌ๋ฅผ ๊ฑฐ์น ๋ค ์ฌ์ฉํ๋ ๊ฒ์ด ๋ชจ๋ ํ์ ์คํฌ๋ฆฝํธ์ ํ์ค ์ ์์ ๋๋ค.
Q24. satisfies ์ฐ์ฐ์๊ฐ ๋์ ๋ ์ด์ ์, as ํ์ ๋จ์ธ ๋ฐฉ์๊ณผ์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์?
- ๐ฏ ์ถ์ ์๋: ํ์ ์คํฌ๋ฆฝํธ 4.9+ ๋ฒ์ ์ ์ต์ ๊ธฐ๋ฅ์ ์ดํดํ๊ณ , ๊ฐ์ฒด์ ์ ๋ฐํ ํ์ ์ ๋ณด(Literal Identity)๋ฅผ ์์ง ์์ผ๋ฉด์๋ ๋ช ์ธ์ ์ผ์นํ๋์ง ๊ฒ์ฆํ๋ ๊ณ ๊ธ ๊ธฐ์ ์ ํ์ธํฉ๋๋ค.
- ๐ก ํต์ฌ ์๋ฆฌ & ๋ต๋ณ:
as๋ ์ปดํ์ผ๋ฌ์๊ฒ "๋ด๊ฐ ๋ง์ผ๋๊น ์ ๋ค๋ฌผ์ด"๋ผ๊ณ ๊ฐ์ํ๋ 'ํ์ ๋จ์ธ'์ด๋ฉฐ, ์์ฑ ์ด๋ฆ ์คํ ๋ฑ์ด ์์ด๋ ์ก์๋ด์ง ๋ชปํ ์ ์์ต๋๋ค. ๋ฐ๋ฉดsatisfies๋ ํน์ ์ธํฐํ์ด์ค๋ฅผ ๋ง์กฑํ๋์ง ๊ฒ์ฌํ๋ฉด์๋, ํด๋น ๊ฐ์ฒด์ ๊ตฌ์ฒด์ ์ธ ๋ฆฌํฐ๋ด ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ ๊ฐ์ฒด์Record<string, string>์satisfiesํ๋ฉด, ๊ฐ ์์ ์ด๋ฆ์ด ๋ฌด์์ธ์ง(์: 'red')๋ฅผ ํ์ ์์ง์ด ๊ธฐ์ตํ๋ฏ๋ก ๋์ค์ ์คํ ๊ฒ์ฌ๊ฐ ๊ฐ๋ฅํด์ง๋๋ค. ๋ช ์์ ํ์ ์ ์ธ๋ณด๋ค ํจ์ฌ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ์ ์ ๋ถ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๐ฃ ์์ฒ ์ด์ ๋ณต๊ธฐ ์ผ๊ธฐ
์ค๋ infer๋ผ๋ ๋
์์ ์ฒ์ ๋ง๋ฌ๋๋ฐ, ํด๋์ค์ ์์ฑ์ ์ธ์ ํ์
๊น์ง ๋ฝ์๋ด๋ ๊ฑธ ๋ณด๊ณ ์๋ฆ ๋์๋ค. ๊ทธ๋์ any๋ก ๋์ถฉ ๋์ฐ๋ฉฐ "์ด์ฐจํผ ๋ด๊ฐ ์๋ ํ์
์ธ๋ฐ ๋ญ!"๋ผ๊ณ ์๊ฐํ๋ ๊ณผ๊ฑฐ์ ๋๋ฅผ ๋ฐ์ฑํ๋ค. ํ์
์คํฌ๋ฆฝํธ๋ ๋จ์ํ ๊ฒ์ฌ๊ธฐ๊ฐ ์๋๋ผ, ์ฝ๋๋ฅผ ๋ ๊ฒฌ๊ณ ํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ํ๋ฅญํ ์ค๊ณ ๋๊ตฌ์๋ค.
๐ก "ํ์ ์ ๋ฌธ์๋ค. ์ด๋ค ๊ฐ์ ๋ฃ์ด์ผ ํ๊ณ ๋ฌด์์ด ๋์ค๋์ง ์ฌ์ฉ์๊ฐ ๊ณ ๋ฏผํ๊ฒ ๋ง๋ค์ง ๋ง๋ผ."
๋ด์ผ์ ๋ฆฌ์กํธ์ ์ฌ์ฅ, '๋ ๋๋ง ์์ง'์ ํํค์ณ๋ณด๊ธฐ๋ก ํ๋ค. ์ํธ ๋์ด "Fiber ์ํคํ ์ฒ ๋ชจ๋ฅด๋ฉด 5๋ ์ฐจ๋ผ๊ณ ํ์ง ๋ง๋ผ"๊ณ ํ์ จ๋๋ฐ... ๋จ๋ฆฐ๋ค! ๐