๐ŸŽญ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…(Conditional Types) ์ดํ•ดํ•˜๊ธฐ ๐ŸŽญ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŽญ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…(Conditional Types) ์ดํ•ดํ•˜๊ธฐ ๐ŸŽญ

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ TypeScript์˜ ๊ฝƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๐Ÿ˜Ž ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์ด ๋ญ”์ง€, ์–ด๋–ป๊ฒŒ ์“ฐ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์™œ ์ค‘์š”ํ•œ์ง€ ํ•จ๊ป˜ ํŒŒํ—ค์ณ๋ณด์ž๊ณ ! ์žฌ๋Šฅ๋„ท์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋‚ด์šฉ์€ ๊ผญ ์•Œ์•„๋‘ฌ์•ผ ํ•ด!

๐Ÿš€ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์ด๋ž€?

์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ํƒ€์ž… ์‹œ์Šคํ…œ์—์„œ ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” TypeScript์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด์•ผ. ์‰ฝ๊ฒŒ ๋งํ•ด, "๋งŒ์•ฝ ์ด ํƒ€์ž…์ด ์ € ํƒ€์ž…์˜ ํ•˜์œ„ ํƒ€์ž…์ด๋ผ๋ฉด ์ด ํƒ€์ž…์„, ์•„๋‹ˆ๋ผ๋ฉด ์ € ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑฐ์ง€.

์ž, ์ด์ œ๋ถ€ํ„ฐ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ์„ธ๊ณ„๋กœ ๋น ์ ธ๋ณผ๊นŒ? ๐ŸŠโ€โ™‚๏ธ ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ๊ณ ๊ณ !

๐Ÿง  ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

T extends U ? X : Y

์ด๊ฒŒ ๋ญ” ์†Œ๋ฆฌ๋ƒ๊ณ ? ๐Ÿ˜… ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด์ค„๊ฒŒ!

  • ๐Ÿ”น T: ์šฐ๋ฆฌ๊ฐ€ ๊ฒ€์‚ฌํ•˜๋ ค๋Š” ํƒ€์ž…
  • ๐Ÿ”น U: T๊ฐ€ ํ™•์žฅ(์ƒ์†)ํ•˜๋Š”์ง€ ํ™•์ธํ•  ํƒ€์ž…
  • ๐Ÿ”น X: T๊ฐ€ U๋ฅผ ํ™•์žฅํ•œ๋‹ค๋ฉด ์‚ฌ์šฉํ•  ํƒ€์ž…
  • ๐Ÿ”น Y: T๊ฐ€ U๋ฅผ ํ™•์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์‚ฌ์šฉํ•  ํƒ€์ž…

์Œ... ์•„์ง๋„ ์ข€ ์–ด๋ ค์›Œ ๋ณด์ด์ง€? ๊ทธ๋Ÿผ ์‹ค์ œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž!

๐ŸŒŸ ์˜ˆ์ œ: ์ˆซ์ž์ธ์ง€ ๋ฌธ์ž์—ด์ธ์ง€ ํ™•์ธํ•˜๊ธฐ

type IsNumber<T> = T extends number ? "๋„ค, ์ˆซ์ž์˜ˆ์š”!" : "์•„๋‹ˆ์š”, ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ์—์š”!";

์ด ํƒ€์ž…์€ ์ฃผ์–ด์ง„ T๊ฐ€ number ํƒ€์ž…์„ ํ™•์žฅํ•˜๋Š”์ง€ ํ™•์ธํ•ด. ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด "๋„ค, ์ˆซ์ž์˜ˆ์š”!"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์•„๋‹ˆ๋ผ๋ฉด "์•„๋‹ˆ์š”, ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ์—์š”!"๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€.

์ด์ œ ์ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ?

type Result1 = IsNumber<42>;  // "๋„ค, ์ˆซ์ž์˜ˆ์š”!"
type Result2 = IsNumber<"Hello">;  // "์•„๋‹ˆ์š”, ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ์—์š”!"

์–ด๋•Œ? ์ด์ œ ์กฐ๊ธˆ ๊ฐ์ด ์˜ค๋‹ˆ? ๐Ÿ˜Š ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ if-else ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ TypeScript์—์„œ ์ •๋ง ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด์•ผ. ์žฌ๋Šฅ๋„ท์—์„œ TypeScript ๊ด€๋ จ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด, ์ด ๊ธฐ๋Šฅ์„ ์ž˜ ํ™œ์šฉํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ?

๐ŸŽข ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ํ™œ์šฉ

์ž, ์ด์ œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๊ธฐ๋ณธ์„ ์•Œ์•˜์œผ๋‹ˆ ์ข€ ๋” ๋ณต์žกํ•œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ? ๐Ÿ•ต๏ธโ€โ™€๏ธ

๐ŸŒŸ ์˜ˆ์ œ: ๋ฐฐ์—ด์ธ์ง€ ํ™•์ธํ•˜๊ธฐ

type IsArray<T> = T extends any[] ? "๋ฐฐ์—ด์ด์—์š”!" : "๋ฐฐ์—ด์ด ์•„๋‹ˆ์—์š”!";

์ด ํƒ€์ž…์€ ์ฃผ์–ด์ง„ T๊ฐ€ ๋ฐฐ์—ด์ธ์ง€ ํ™•์ธํ•ด. any[]๋Š” "์–ด๋–ค ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋“ "์„ ์˜๋ฏธํ•ด.

์ด์ œ ์ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋ณด์ž:

type Result3 = IsArray<number[]>;  // "๋ฐฐ์—ด์ด์—์š”!"
type Result4 = IsArray<string>;  // "๋ฐฐ์—ด์ด ์•„๋‹ˆ์—์š”!"
type Result5 = IsArray<{name: string}>;  // "๋ฐฐ์—ด์ด ์•„๋‹ˆ์—์š”!"

์˜คํ˜ธ๋ผ! ๐Ÿ˜ฒ ์ด์ œ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ํƒ€์ž…์ด ๋ฐฐ์—ด์ธ์ง€ ์•„๋‹Œ์ง€ ์‰ฝ๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ์ด๋Ÿฐ ๊ธฐ๋Šฅ์€ ํŠนํžˆ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๋‹ค๋ฃฐ ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ด.

์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ์‹œ์Šคํ…œ์—์„œ ๋” ๋ณต์žกํ•œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋Š” ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ผ!

๐Ÿ’ก ํŒ: ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ๋‹จ์ˆœํžˆ "์ด๊ฑฐ ์•„๋‹ˆ๋ฉด ์ €๊ฑฐ"๋ฅผ ๋„˜์–ด์„œ ๋ณต์žกํ•œ ํƒ€์ž… ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€!

์ž, ์ด์ œ ์ข€ ๋” ๋ณต์žกํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ ์ค€๋น„๊ฐ€ ๋์–ด? ๊ทธ๋Ÿผ ๋‹ค์Œ ์„น์…˜์œผ๋กœ ๊ณ ๊ณ ! ๐Ÿš€

๐ŸŽญ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…๊ณผ ์œ ๋‹ˆ์˜จ ํƒ€์ž…

์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ์œ ๋‹ˆ์˜จ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๋•Œ ๋”์šฑ ๊ฐ•๋ ฅํ•ด์ ธ. ์–ด๋–ป๊ฒŒ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ๋Š”์ง€ ํ•œ๋ฒˆ ์•Œ์•„๋ณผ๊นŒ? ๐Ÿค”

๐ŸŒŸ ์˜ˆ์ œ: ์œ ๋‹ˆ์˜จ ํƒ€์ž…์—์„œ null๊ณผ undefined ์ œ๊ฑฐํ•˜๊ธฐ

type NonNullable<T> = T extends null | undefined ? never : T;

์ด ํƒ€์ž…์€ T์—์„œ null๊ณผ undefined๋ฅผ ์ œ๊ฑฐํ•ด. ๋งŒ์•ฝ T๊ฐ€ null์ด๋‚˜ undefined๋ผ๋ฉด never ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด T๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ด.

์ด์ œ ์ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋ณด์ž:

type Result6 = NonNullable<string | number | null | undefined>;  // string | number

์™€์šฐ! ๐Ÿ˜ฎ null๊ณผ undefined๊ฐ€ ์‚ฌ๋ผ์กŒ์–ด! ์ด๋ ‡๊ฒŒ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ๋‹ˆ์˜จ ํƒ€์ž…์—์„œ ํŠน์ • ํƒ€์ž…์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด.

์ด๋Ÿฐ ๊ธฐ๋Šฅ์€ ํŠนํžˆ API ์‘๋‹ต์ด๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฐ™์€ ๋ถˆํ™•์‹คํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ด. ์žฌ๋Šฅ๋„ท์—์„œ ๋ฐฑ์—”๋“œ API์™€ ํ†ต์‹ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด, ์ด๋Ÿฐ ํ…Œํฌ๋‹‰์„ ํ™œ์šฉํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ?

๐Ÿ’ก ํŒ: ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์˜ ๊ฐ ๋ฉค๋ฒ„์— ๋Œ€ํ•ด ๊ฐœ๋ณ„์ ์œผ๋กœ ์ ์šฉ๋ผ. ์ด๋ฅผ "๋ถ„๋ฐฐ ๋ฒ•์น™"์ด๋ผ๊ณ  ๋ถˆ๋Ÿฌ. ์ด ํŠน์„ฑ์„ ์ด์šฉํ•˜๋ฉด ๋” ๋ณต์žกํ•œ ํƒ€์ž… ๋ณ€ํ™˜์„ ํ•  ์ˆ˜ ์žˆ์–ด!

์ž, ์ด์ œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…๊ณผ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์˜ ์กฐํ•ฉ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋์–ด. ๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹ˆ์•ผ! ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ธ infer ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋์–ด? Let's go! ๐Ÿƒโ€โ™‚๏ธ

๐Ÿ”ฎ infer ํ‚ค์›Œ๋“œ: ํƒ€์ž… ์ถ”๋ก ์˜ ๋งˆ๋ฒ•

์ž, ์ด์ œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ์ง„์งœ ๋งˆ๋ฒ• ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์†Œ๊ฐœํ• ๊ฒŒ. ๋ฐ”๋กœ 'infer' ํ‚ค์›Œ๋“œ์•ผ! ๐Ÿ˜ฒ

๐ŸŒŸ infer๋ž€?

infer ํ‚ค์›Œ๋“œ๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ๋‚ด์—์„œ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ณ  ๊ทธ ์ถ”๋ก ๋œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ๋งˆ์น˜ ํƒ€์ž… ์‹œ์Šคํ…œ ์•ˆ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด!

์Œ... ์ข€ ์–ด๋ ค์›Œ ๋ณด์ด์ง€? ๊ฑฑ์ •๋งˆ, ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ! ๐Ÿค“

๐ŸŒŸ ์˜ˆ์ œ: ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž… ์ถ”์ถœํ•˜๊ธฐ

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;

์ด ํƒ€์ž…์€ ํ•จ์ˆ˜ T์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ถ”์ถœํ•ด. T๊ฐ€ ํ•จ์ˆ˜๋ผ๋ฉด ๊ทธ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ R๋กœ ์ถ”๋ก ํ•˜๊ณ , ๊ทธ R์„ ๋ฐ˜ํ™˜ํ•ด. T๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด never๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€.

์ด์ œ ์ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋ณด์ž:

function greet(name: string): string {
  return `Hello, ${name}!`;
}

type GreetReturnType = ReturnType<typeof greet>;  // string

์™€! ๐Ÿ˜ฎ ์šฐ๋ฆฌ๋Š” greet ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด string์ด๋ผ๋Š” ๊ฑธ ์ž๋™์œผ๋กœ ์ถ”์ถœํ–ˆ์–ด! ์ด๊ฒŒ ๋ฐ”๋กœ infer์˜ ํž˜์ด์•ผ.

infer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ํƒ€์ž…์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋Š” ํŠนํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํƒ€์ž…์„ ๋‹ค๋ฃฐ ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ด. ์žฌ๋Šฅ๋„ท์—์„œ TypeScript๋กœ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด, ์ด๋Ÿฐ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ์ฝ”๋“œ์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ!

๐Ÿ’ก ํŒ: infer๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์‹ฌ์ง€์–ด ์žฌ๊ท€์ ์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€! ์ด๋ฅผ ํ†ตํ•ด ์ •๋ง ๋ณต์žกํ•œ ํƒ€์ž… ๋กœ์ง๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด.

์ž, ์ด์ œ infer์˜ ๊ธฐ๋ณธ์„ ์•Œ๊ฒŒ ๋์–ด. ๊ทผ๋ฐ ์ด๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹ˆ์•ผ! infer๋Š” ๋” ๋ณต์žกํ•œ ์ƒํ™ฉ์—์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด. ๋‹ค์Œ ์„น์…˜์—์„œ ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด๋ณด์ž๊ณ ! ๐ŸŠโ€โ™‚๏ธ

๐Ÿงฉ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๊ณ ๊ธ‰ ํ™œ์šฉ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…๊ณผ infer์˜ ๊ธฐ๋ณธ์„ ์•Œ๊ฒŒ ๋์–ด. ๊ทธ๋Ÿผ ์ด์ œ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์‹ค์ œ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์•Œ์•„๋ณผ๊นŒ? ๐Ÿค”

๐ŸŒŸ ์˜ˆ์ œ: ๊ฐ์ฒด์—์„œ ํŠน์ • ํƒ€์ž…์˜ ํ‚ค๋งŒ ์ถ”์ถœํ•˜๊ธฐ

type FilterKeys<T, U> = {
  [K in keyof T]: T[K] extends U ? K : never
}[keyof T];

์ด ํƒ€์ž…์€ ๊ฐ์ฒด T์—์„œ U ํƒ€์ž…์˜ ๊ฐ’์„ ๊ฐ€์ง„ ํ‚ค๋งŒ ์ถ”์ถœํ•ด. ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ, ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณด๋ฉด ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์•„!

์ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋ณด์ž:

interface Person {
  name: string;
  age: number;
  isStudent: boolean;
}

type StringKeys = FilterKeys<Person, string>;  // "name"
type NumberKeys = FilterKeys<Person, number>;  // "age"
type BooleanKeys = FilterKeys<Person, boolean>;  // "isStudent"

์™€์šฐ! ๐Ÿ˜ฒ ์šฐ๋ฆฌ๋Š” Person ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ฐ ํƒ€์ž…๋ณ„๋กœ ํ‚ค๋ฅผ ์ถ”์ถœํ–ˆ์–ด. ์ด๋Ÿฐ ๊ธฐ๋Šฅ์€ ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ด.

์ด๋Ÿฐ ๊ณ ๊ธ‰ ํƒ€์ž… ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด, ์ฝ”๋“œ์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด, ์ด๋Ÿฐ ํ…Œํฌ๋‹‰์„ ํ™œ์šฉํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ?

๐Ÿ’ก ํŒ: ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ์žฌ๊ท€์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด. ์ด๋ฅผ ํ†ตํ•ด ๊นŠ์ด ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๊ตฌ์กฐ๋„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์ง€. ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋ณต์žกํ•œ ํƒ€์ž…์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•ด!

์ž, ์ด์ œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๊ณ ๊ธ‰ ํ™œ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹ˆ์•ผ! ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋์–ด? Let's dive deeper! ๐ŸŠโ€โ™‚๏ธ

๐Ÿš€ ์‹ค์ „ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ํ™œ์šฉ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ! ๐Ÿ› ๏ธ

๐ŸŒŸ ์‹œ๋‚˜๋ฆฌ์˜ค: API ์‘๋‹ต ์ฒ˜๋ฆฌํ•˜๊ธฐ

์šฐ๋ฆฌ๊ฐ€ ์™ธ๋ถ€ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. API๋Š” ์„ฑ๊ณตํ•  ๋•Œ์™€ ์‹คํŒจํ•  ๋•Œ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ด.

๋จผ์ €, API ์‘๋‹ต์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ด๋ณผ๊ฒŒ:

interface SuccessResponse<T> {
  status: 'success';
  data: T;
}

interface ErrorResponse {
  status: 'error';
  message: string;
}

type ApiResponse<T> = SuccessResponse<T> | ErrorResponse;

์ด์ œ ์ด API ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž:

function handleApiResponse<T>(response: ApiResponse<T>) {
  if (response.status === 'success') {
    // ์„ฑ๊ณต ์ผ€์ด์Šค ์ฒ˜๋ฆฌ
    console.log('Data:', response.data);
  } else {
    // ์—๋Ÿฌ ์ผ€์ด์Šค ์ฒ˜๋ฆฌ
    console.error('Error:', response.message);
  }
}

์ด ์ฝ”๋“œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ, TypeScript์˜ ํƒ€์ž… ์ถ”๋ก ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์–ด. ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฅผ ๊ฐœ์„ ํ•ด๋ณผ๊นŒ?

๐ŸŒŸ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ํ™œ์šฉํ•œ ๊ฐœ์„ 

type ExtractResponseData<T> = T extends SuccessResponse<infer U> ? U : never;

function handleApiResponse<T>(response: ApiResponse<T>): ExtractResponseData<typeof response> | null {
  if (response.status === 'success') {
    console.log('Data:', response.data);
    return response.data;
  } else {
    console.error('Error:', response.message);
    return null;
  }
}

์™€! ๐Ÿ˜ฎ ์ด์ œ handleApiResponse ํ•จ์ˆ˜๋Š” ์„ฑ๊ณต ์ผ€์ด์Šค์ผ ๋•Œ ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์‹คํŒจ ์ผ€์ด์Šค์ผ ๋•Œ๋Š” null์„ ๋ฐ˜ํ™˜ํ•ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ํ›จ์”ฌ ๋†’์•„์ง€์ง€!

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ํ™œ์šฉํ•˜๋ฉด, ๋ณต์žกํ•œ API ์‘๋‹ต๋„ ํƒ€์ž… ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ ์™ธ๋ถ€ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด, ์ด๋Ÿฐ ํŒจํ„ด์„ ์ ์šฉํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ?

๐Ÿ’ก ํŒ: ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ๋‹จ์ˆœํžˆ ํƒ€์ž… ์ฒดํฌ๋ฅผ ๋„˜์–ด์„œ, ๋ณต์žกํ•œ ํƒ€์ž… ๋ณ€ํ™˜ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, API ์‘๋‹ต์˜ ํŠน์ • ํ•„๋“œ๋งŒ ์ถ”์ถœํ•˜๊ฑฐ๋‚˜, ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ํ‰ํƒ„ํ™”ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…๋„ ๊ฐ€๋Šฅํ•˜์ง€!

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ดค์–ด. ๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹ˆ์•ผ! ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ์„ฑ๋Šฅ๊ณผ ์ฃผ์˜์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. Ready for more? Let's go! ๐Ÿš€

โš–๏ธ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ์„ฑ๋Šฅ๊ณผ ์ฃผ์˜์‚ฌํ•ญ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๊ฐ•๋ ฅํ•จ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์•Œ์•„๋ดค์–ด. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๊ทธ๋ ‡๋“ฏ, ์กฐ๊ฑด๋ถ€ ํƒ€์ž…๋„ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ด. ์™œ ๊ทธ๋Ÿฐ์ง€ ์•Œ์•„๋ณผ๊นŒ? ๐Ÿง

๐ŸŒŸ ์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ

  • ๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ž‘์—…๋Ÿ‰์„ ์ฆ๊ฐ€์‹œ์ผœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์–ด.
  • ํŠนํžˆ ์žฌ๊ท€์ ์ธ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ์ปดํŒŒ์ผ๋Ÿฌ์— ํฐ ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ์–ด.
  • ํƒ€์ž… ์ถ”๋ก ์ด ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก IDE์˜ ์„ฑ๋Šฅ๋„ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด.

๊ทธ๋ ‡๋‹ค๊ณ  ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ์‚ฌ์šฉ์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑด ์•„๋‹ˆ์•ผ. ๋‹ค๋งŒ, ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด!

๐ŸŒŸ ์ฃผ์˜์‚ฌํ•ญ

  • ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ์–ด.
  • ๊ณผ๋„ํ•œ ํƒ€์ž… ์ถ”๋ก ์€ ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.
  • ๋ชจ๋“  ์ƒํ™ฉ์— ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ผ ์ˆ˜ ์žˆ์–ด.

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ์ค„๊ฒŒ! ๐Ÿ‘‡

๐Ÿ’ก ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ์‚ฌ์šฉ ํŒ

  1. ๊ฐ€๋Šฅํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ: ๋ณต์žกํ•œ ๋กœ์ง์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌํ˜„ํ•ด.
  2. ์žฌ์‚ฌ์šฉ์„ฑ ๊ณ ๋ คํ•˜๊ธฐ: ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ๋ณ„๋„์˜ ํƒ€์ž…์œผ๋กœ ์ •์˜ํ•ด ์žฌ์‚ฌ์šฉํ•ด.
  3. ๋ฌธ์„œํ™”ํ•˜๊ธฐ: ๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ์ฃผ์„์„ ํ†ตํ•ด ๊ทธ ๋ชฉ์ ๊ณผ ๋™์ž‘์„ ์„ค๋ช…ํ•ด.
  4. ํ…Œ์ŠคํŠธํ•˜๊ธฐ: ์กฐ๊ฑด๋ถ€ ํƒ€์ž…๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด. TypeScript์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•ด ํƒ€์ž… ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด๋ด.

์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋ชจ๋“  ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹ˆ์•ผ. ์žฌ๋Šฅ๋„ท์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ, ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์ด ์ •๋ง ํ•„์š”ํ•œ ์ƒํ™ฉ์ธ์ง€ ์‹ ์ค‘ํžˆ ๊ณ ๋ คํ•ด๋ด. ๋•Œ๋กœ๋Š” ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์œ ๋‹ˆ์˜จ ํƒ€์ž…๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์–ด!

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ์žฅ๋‹จ์ ๊ณผ ์ฃผ์˜์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ๋” ํšจ๊ณผ์ ์œผ๋กœ TypeScript๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ๊ทธ๋Ÿผ ์ด์ œ ๋งˆ์ง€๋ง‰ ์„น์…˜์œผ๋กœ ๋„˜์–ด๊ฐ€๋ณผ๊นŒ? ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๋ฏธ๋ž˜์™€ TypeScript์˜ ๋ฐœ์ „ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ ๊ฑฐ์•ผ. Ready? Let's wrap it up! ๐ŸŽ

๐Ÿ”ฎ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๋ฏธ๋ž˜์™€ TypeScript์˜ ๋ฐœ์ „

์šฐ์™€, ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ๊นŒ์ง€ ์™”๋‹ค๋‹ˆ ์ •๋ง ๋Œ€๋‹จํ•ด! ๐ŸŽ‰ ์ด์ œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๋ฏธ๋ž˜์™€ TypeScript์˜ ๋ฐœ์ „ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ๊นŒ?

๐ŸŒŸ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๋ฏธ๋ž˜

  • ๋” ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์ถ”๋ก : ์•ž์œผ๋กœ TypeScript๋Š” ๋” ๋ณต์žกํ•œ ํƒ€์ž… ๊ด€๊ณ„๋„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์•ผ.
  • ์„ฑ๋Šฅ ๊ฐœ์„ : ๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ์ปดํŒŒ์ผ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ผ.
  • ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•: ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์ด ๋„์ž…๋  ์ˆ˜๋„ ์žˆ์–ด.

TypeScript ํŒ€์€ ๊ณ„์†ํ•ด์„œ ์–ธ์–ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ์žˆ์–ด. ๊ทธ๋“ค์˜ ๋ชฉํ‘œ๋Š” JavaScript์˜ ์œ ์—ฐ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋” ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•˜๋Š” ๊ฑฐ์ง€.

๐ŸŒŸ TypeScript์˜ ๋ฐœ์ „ ๋ฐฉํ–ฅ

  • JavaScript์™€์˜ ํ˜ธํ™˜์„ฑ ์œ ์ง€: TypeScript๋Š” ํ•ญ์ƒ JavaScript์˜ ์ƒ์œ„์ง‘ํ•ฉ์ด ๋  ๊ฑฐ์•ผ.
  • ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜: ๋” ์ •ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ๋” ๋น ๋ฅธ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์–ด.
  • ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๊ฐœ์„ : ํƒ€์ž… ์ •๋ณด๋ฅผ ํ™œ์šฉํ•ด JavaScript ์—”์ง„์˜ ์ตœ์ ํ™”๋ฅผ ๋•๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ์–ด.

TypeScript์™€ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๋ฐœ์ „์€ ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋” ๋‚˜์€ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•  ๊ฑฐ์•ผ. ์žฌ๋Šฅ๋„ท์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ, ์ด๋Ÿฐ ๋ฐœ์ „ ๋ฐฉํ–ฅ์„ ์—ผ๋‘์— ๋‘๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฏธ๋ž˜์—๋„ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ!

๐Ÿ’ก ๋งˆ์ง€๋ง‰ ํŒ: TypeScript์™€ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ๊ณ„์† ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด. ๊ณต์‹ ๋ฌธ์„œ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด!

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์—ฌ์ •์ด ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด. ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์— ๋Œ€ํ•ด ์ •๋ง ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์› ์ง€? ์ด ์ง€์‹์„ ํ™œ์šฉํ•ด์„œ ๋” ์•ˆ์ „ํ•˜๊ณ , ๋” ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ์žฌ๋Šฅ๋„ท์—์„œ์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋Œ€๋ฐ• ๋‚˜๊ธธ ๋ฐ”๋ž„๊ฒŒ! ํ™”์ดํŒ…! ๐Ÿ’ช

๐ŸŽ“ ๋งˆ๋ฌด๋ฆฌ: ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ๋งˆ์Šคํ„ฐ๋˜๊ธฐ

์™€์šฐ! ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง ๊ธด ์—ฌ์ •์„ ํ•จ๊ป˜ ํ–ˆ๋„ค์š”. ๐Ÿ‘ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์— ๋Œ€ํ•ด ์ด๋ ‡๊ฒŒ ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ณธ ๊ฑด ์ฒ˜์Œ์ด์ฃ ? ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ง„์ •ํ•œ TypeScript ๋งˆ์Šคํ„ฐ์— ํ•œ ๊ฑธ์Œ ๋” ๊ฐ€๊นŒ์›Œ์กŒ์–ด์š”!

๐ŸŒŸ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”?

  1. ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋ฌธ๋ฒ•
  2. infer ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•œ ํƒ€์ž… ์ถ”๋ก 
  3. ์œ ๋‹ˆ์˜จ ํƒ€์ž…๊ณผ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ์กฐํ•ฉ
  4. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ํ™œ์šฉ
  5. ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ๊ณผ ์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ
  6. TypeScript์™€ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๋ฏธ๋ž˜

์ด ๋ชจ๋“  ์ง€์‹์„ ์žฌ๋Šฅ๋„ท์—์„œ์˜ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋”์šฑ ์•ˆ์ „ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์›Œ์งˆ ๊ฑฐ์˜ˆ์š”. ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ๊ณง ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ์‹ค๋ ฅ ํ–ฅ์ƒ์œผ๋กœ ์ด์–ด์งˆ ๊ฑฐ๊ณ ์š”! ๐Ÿ˜Š

๐Ÿ’ก ์•ž์œผ๋กœ์˜ ํ•™์Šต ๋ฐฉํ–ฅ

  • TypeScript ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๊พธ์ค€ํžˆ ํ™•์ธํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ํ•™์Šตํ•˜๊ธฐ
  • ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ํƒ€์ž… ์ •์˜ ํŒŒ์ผ์„ ๋ถ„์„ํ•˜๋ฉฐ ์‹ค์ „ ํ™œ์šฉ๋ฒ• ์ตํžˆ๊ธฐ
  • ๋™๋ฃŒ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ TypeScript ๊ด€๋ จ ์ง€์‹ ๊ณต์œ ํ•˜๊ธฐ
  • ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ์‹ค์ „ ๊ฒฝํ—˜ ์Œ“๊ธฐ

์—ฌ๋Ÿฌ๋ถ„, ๊ธฐ์–ตํ•˜์„ธ์š”. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์€ ํ•˜๋ฃจ์•„์นจ์— ๋Š˜์ง€ ์•Š์•„์š”. ๊พธ์ค€ํ•œ ํ•™์Šต๊ณผ ์‹ค์ „ ๊ฒฝํ—˜์ด ํ•„์š”ํ•˜์ฃ . ํ•˜์ง€๋งŒ ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ํ•œ ์ด ์—ฌ์ •์€ ์—ฌ๋Ÿฌ๋ถ„์„ ํ•œ ๋‹จ๊ณ„ ๋” ์„ฑ์žฅ์‹œ์ผฐ์„ ๊ฑฐ์˜ˆ์š”. ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹ค๋ ฅ์„ ๋งˆ์Œ๊ป ๋ฝ๋‚ด๋ณด์„ธ์š”!

์ž, ์ด์ œ ์ •๋ง ๋์ด์—์š”. ์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ๋‹ฌ์ธ์ด ๋˜์—ˆ์–ด์š”! ๐Ÿ† ์ด ์ง€์‹์„ ํ™œ์šฉํ•ด ๋” ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ์–ธ์ œ๋“  ์–ด๋ ค์›€์ด ์žˆ๋‹ค๋ฉด, ์ด ๊ธ€์„ ๋‹ค์‹œ ์ฐพ์•„์™€ ๋ณต์Šตํ•ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ TypeScript ์—ฌ์ •์„ ์‘์›ํ• ๊ฒŒ์š”. ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜„