Intersection Type

์ธํ„ฐ์„น์…˜ ํƒ€์ž…์„ ์ด์šฉํ•ด โ€œ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์— ๋ชจ๋‘ ํ•ด๋‹นโ€ํ•˜๋Š” ํƒ€์ž…์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

๋™๊ธฐ๋ถ€์—ฌ

์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž…๊ณผ ๊ฐ’์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ–ˆ๋‹ค๊ณ  ํ•˜์ž.
type Programmer = { favoriteLanguage: string }; const programmer: Programmer = { favoriteLanguage: 'TypeScript' };
๊ทธ๋ฆฌ๊ณ  ๋งฅ์ฃผ๋ฅผ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ํƒ€์ž…๊ณผ ๊ฐ’์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ–ˆ๋‹ค.
type BeerLover = { favoriteBeer: string }; const beerLover: BeerLover = { favoriteBeer: 'Imperial Stout' };
๊ทธ๋ ‡๋‹ค๋ฉด, ๋งฅ์ฃผ๋ฅผ ์ข‹์•„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ํƒ€์ž…์€ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์„๊นŒ? ๋ฌผ๋ก  ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋‹ค ์ ์–ด ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ์‹์˜ ๋‹จ์ˆœํ•œ ์ ‘๊ทผ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
type BeerLovingProgrammer = { favoriteLanguage: string; favoriteBeer: string; }; const AhnHeejong: BeerLovingProgrammer = { favoriteLanguage: 'TypeScript', favoriteBeer: 'Imperial Stout', };
ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์ ‘๊ทผ์€ ์ฝ”๋“œ ๋ณต์‚ฌโ€“๋ถ™์—ฌ๋„ฃ๊ธฐ์™€ ๋™์ผํ•˜๊ฒŒ ๋ณ€ํ™”์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์„ ๊ฐ–๋Š”๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ถ”ํ›„ Programmer ํƒ€์ž…์— ๋ฌธ์ž์—ด ํƒ€์ž… textEditor ์†์„ฑ์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ์ฐพ์•„ ํ•ด๋‹น ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
๊ท€์ฐฎ์€ ๊ฒƒ์€ ์ฐจ์น˜ํ•˜๋”๋ผ๋„, ์ด ๊ณผ์ •์—์„œ ์–ด๋””์ธ๊ฐ€ ๋นผ๋จน์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
์ด๋Ÿฐ ๋น„ํšจ์œจ์„ ํ”ผํ•˜๊ณ  ๋ณ€ํ™”์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ํƒ€์ž…์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์ด ํ•„์š”ํ•˜๋‹ค.
์ธํ„ฐ์„น์…˜ ํƒ€์ž…์€ ๋ฐ”๋กœ ๊ทธ๊ฑธ ๊ฐ€๋Šฅ์ผ€ ํ•œ๋‹ค.

๋ฌธ๋ฒ•

์—ฌ๋Ÿฌ ํƒ€์ž…์„ ์•ฐํผ์ƒŒ๋“œ(&) ๊ธฐํ˜ธ๋กœ ์ด์–ด์„œ ์ธํ„ฐ์„น์…˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
type BeerLovingProgrammer = Programmar & BeerLover;
A & B ํƒ€์ž…์˜ ๊ฐ’์€ A ํƒ€์ž…์—๋„, B ํƒ€์ž…์—๋„ ํ• ๋‹น ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
๋งŒ์•ฝ A์™€ B ๋ชจ๋‘ ๊ฐ์ฒด ํƒ€์ž…์ด๋ผ๋ฉด A & B ํƒ€์ž…์˜ ๊ฐ์ฒด๋Š” A์™€ B ํƒ€์ž… ๊ฐ๊ฐ์— ์ •์˜๋œ ์†์„ฑ ๋ชจ๋‘๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
type Infeasible = string & number
๋ฌธ์ž์—ด์ธ ๋™์‹œ์— ์ˆซ์ž์ธ ๊ฐ’์€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์œ„ Infeasible ํƒ€์ž…์€ ์‹ค์ œ๋กœ๋Š” ์–ด๋–ค ๊ฐ’๋„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
์ธํ„ฐ์„น์…˜ ํƒ€์ž… ์—ญ์‹œ ๋ช‡ ๊ฐœ๋“  ์ด์–ด๊ฐ€๋ฉฐ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
type Awesome = Programmer & BeerLover & CatLover;

์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ์ ์€ ์ธํ„ฐ์„น์…˜ ํƒ€์ž…

์ธํ„ฐ์„น์…˜ ํƒ€์ž…์„ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ์ ์„ ๋•Œ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์˜ ๊ทธ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋‚ด์šฉ์ด ์ ์šฉ๋œ๋‹ค. ์•„๋ž˜ ๋‘ ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
type BeerLovingProgrammer = Programmer & BeerLover; type BeerLovingProgrammer2 = & Programmer & BeerLover;