๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿค Chapter 6. ํƒ€์ž… ์„ ์–ธ๊ณผ @types

๐Ÿฅ• ์•„์ดํ…œ 45. devDependencies์— typescript์™€ @types ์ถ”๊ฐ€ํ•˜๊ธฐโ€‹

npm(node package manager)์€ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์˜์กด์„ฑ์„ ๊ตฌ๋ถ„ํ•ด์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๊ฐ๊ฐ์˜ ์˜์กด์„ฑ์€ package.json ํŒŒ์ผ ๋‚ด์˜ ๋ณ„๋„ ์˜์—ญ์— ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • dependencies ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ๋Ÿฐํƒ€์ž„์— lodash๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด dependencies์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • devDependencies ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๋Ÿฐํƒ€์ž„์—๋Š” ํ•„์š” ์—†๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ devDependencies์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ npm์— ๊ณต๊ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•œ๋‹ค๋ฉด, devDependencies์— ํฌํ•จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

  • peerDependencies ๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•˜๊ธด ํ•˜์ง€๋งŒ, ์˜์กด์„ฑ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ํฌํž˜๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐœ๋ฐœ ๋„๊ตฌ์ผ ๋ฟ์ด๊ณ  ํƒ€์ž… ์ •๋ณด๋Š” ๋Ÿฐํƒ€์ž„์— ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ devDependencies์— ์†ํ•ฉ๋‹ˆ๋‹ค.

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

  • ํŒ€์›๋“ค ๋ชจ๋‘๊ฐ€ ํ•ญ์ƒ ๋™์ผํ•œ ๋ฒ„์ „์„ ์„ค์น˜ํ•œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ๋ฅผ ์…‹์—…ํ•  ๋•Œ ๋ณ„๋„์˜ ๋‹จ๊ณ„๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ๋กœ ์„ค์น˜ํ•˜๊ธฐ๋ณด๋‹ค๋Š” devDependencies์— ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ, ํƒ€์ž… ์˜์กด์„ฑ(@types)์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํƒ€์ž… ์„ ์–ธ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋”๋ผ๋„, Definitely/Typed์—์„œ ํƒ€์ž… ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๊ฐ€ dependencies์— ์žˆ๋”๋ผ๋„ @types ์˜์กด์„ฑ์€ devDependencies์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฅ• ์•„์ดํ…œ 46. ํƒ€์ž… ์„ ์–ธ๊ณผ ๊ด€๋ จ๋œ ์„ธ ๊ฐ€์ง€ ๋ฒ„์ „ ์ดํ•ดํ•˜๊ธฐโ€‹

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์•Œ์•„์„œ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ๊ธฐ๋Š”์ปค๋…•, ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์˜คํžˆ๋ ค ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „
  • ํƒ€์ž… ์„ ์–ธ(@types)์˜ ๋ฒ„์ „
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๋ฒ„์ „

์„ธ ๊ฐ€์ง€ ๋ฒ„์ „ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋งž์ง€ ์•Š์œผ๋ฉด, ์˜์กด์„ฑ๊ณผ ์ƒ๊ด€์—†์–ด ๋ณด์ด๋Š” ๊ณณ์—์„œ ์—‰๋šฑํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ dependencies๋กœ ์„ค์น˜ํ•˜๊ณ , ํƒ€์ž… ์ •๋ณด๋Š” devDependencies๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

$ npm install react
+ react@16.8.6

$ npm install --save-dev @types/react
+ react@16.8.19

๋ฉ”์ด์ € ๋ฒ„์ „๊ณผ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์ด ์ผ์น˜ํ•˜์ง€๋งŒ ํŒจ์น˜ ๋ฒ„์ „์€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ฃผ๋ชฉํ•˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์‹ค์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํƒ€์ž… ์ •๋ณด์˜ ๋ฒ„์ „์ด ๋ณ„๋„๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์„ธ ๋ฒˆ์งธ, ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฒ„์ „๋ณด๋‹ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฒ„์ „์ด ์ตœ์‹ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋ณด๋‹ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฒ„์ „์ด ๋†’์€ ์ƒํ™ฉ์ด๋ผ๋ฉด, @types ์„ ์–ธ ์ž์ฒด์—์„œ ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฒ„์ „์„ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ€์ž… ์„ ์–ธ์˜ ๋ฒ„์ „์„ ์›๋ž˜๋Œ€๋กœ ๋‚ด๋ฆฌ๊ฑฐ๋‚˜, declare module์„ ์–ธ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํƒ€์ž… ์ •๋ณด๋ฅผ ์—†์•  ๋ฒ„๋ฆฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

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

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

๐Ÿฅ• ์•„์ดํ…œ 47. ๊ณต๊ฐœ API์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ์ต์ŠคํฌํŠธ ํ•˜๊ธฐโ€‹

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘์ž๋Š” ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์— ํƒ€์ž… ์ต์ŠคํฌํŠธ๋ถ€ํ„ฐ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•จ์ˆ˜์˜ ์„ ์–ธ์— ์ด๋ฏธ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ œ๋Œ€๋กœ ์ต์ŠคํฌํŠธ ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋ฉฐ, ํƒ€์ž… ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ฉด ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์–ด๋–ค ํƒ€์ž…์„ ์ˆจ๊ธฐ๊ณ  ์‹ถ์–ด์„œ ์ต์ŠคํฌํŠธ ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

interface SecretName {
first: string;
last: string;
}

interface SecretSanta {
name: SecretName;
gift: string;
}

export function getGift(name: SecretName, gift: string): SecretSanta {
// ...
}

ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๋Š” SecretName ๋˜๋Š” SecretSanta๋ฅผ ์ง์ ‘ ์ž„ํฌํŠธํ•  ์ˆ˜ ์—†๊ณ , getGift๋งŒ ์ž„ํฌํŠธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํƒ€์ž…๋“ค์€ ์ต์ŠคํฌํŠธ๋œ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ๋“ฑ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ถœํ•ด ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์ถœํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ Parameters์™€ ReturnType ์ œ๋„ˆ๋ฆญ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

type MySanta = ReturnType<typeof getGift>; // SecretSanta
type MaName = Parameters<typeof getGift>[0]; // SecretName

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

๐Ÿฅ• ์•„์ดํ…œ 48. API ์ฃผ์„์— TSDoc ์‚ฌ์šฉํ•˜๊ธฐโ€‹

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

/** ์ธ์‚ฌ๋ง์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋ณด๊ธฐ ์ข‹๊ฒŒ ๊พธ๋ฉฐ์ง‘๋‹ˆ๋‹ค. */
function greetJSDoc(name: string, title: string) {
return `Hello ${title} ${name}`;
}

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด ์„œ๋น„์Šค๊ฐ€ JSDoc ์Šคํƒ€์ผ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹ใ……๋ธŒ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ณต๊ฐœ API์— ์ฃผ์„์„ ๋ถ™์ธ๋‹ค๋ฉด JSDoc ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JSDoc์—๋Š” @param๊ณผ @returns ๊ฐ™์€ ์ผ๋ฐ˜์  ๊ทœ์น™์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ด€์ ์—์„œ๋Š” TSDoc์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

/**
* ์ธ์‚ฌ๋ง์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
* @param name ์ธ์‚ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„
* @param title ๊ทธ ์‚ฌ๋žŒ์˜ ์นญํ˜ธ
* @returns ์‚ฌ๋žŒ์ด ๋ณด๊ธฐ ์ข‹์€ ํ˜•ํƒœ์˜ ์ธ์‚ฌ๋ง
*/
function greetJSDoc(name: string, title: string) {
return `Hello ${title} ${name}`;
}

ํƒ€์ž… ์ •์˜์— TSDoc์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

/** ํŠน์ • ์‹œ๊ฐ„๊ณผ ์žฅ์†Œ์—์„œ ์ˆ˜ํ–‰๋œ ์ธก์ • */
interface Measurement {
/** ์–ด๋””์—์„œ ์ธก์ •๋˜์—ˆ๋‚˜? */
position: Vector3D;
/** ์–ธ์ œ ์ธก์ •๋˜์—ˆ๋‚˜? epoch์—์„œ๋ถ€ํ„ฐ ์ดˆ ๋‹จ์œ„๋กœ */
time: number;
/** ์ธก์ •๋œ ์šด๋™๋Ÿ‰ */
momentum: Vector3D;
}

TSDoc ์ฃผ์„์€ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ๊พธ๋ฉฐ์ง€๋ฏ€๋กœ ๊ตต์€ ๊ธ€์”จ, ๊ธฐ์šธ์ž„ ๊ธ€์”จ, ๊ธ€๋จธ๋ฆฌ๊ธฐํ˜ธ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/**
* ์ด _interface_๋Š” **์„ธ ๊ฐ€์ง€** ์†์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
* 1. x
* 2. y
* 3. z
*/
interface Vector3D {
x: number;
y: number;
z: number;
}

์ฃผ์„์„ ์ˆ˜ํ•„์ฒ˜๋Ÿผ ์žฅํ™ฉํ•˜๊ฒŒ ์“ฐ์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ดํ– ํ•ฉ๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•œ ์ฃผ์„์€ ๊ฐ„๋‹จํžˆ ์š”์ ๋งŒ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํƒ€์ž… ์ •๋ณด๊ฐ€ ์ฝ”๋“œ์— ์žˆ๊ธฐ ๋–„๋ฌธ์— TSDoc์—์„œ๋Š” ํƒ€์ž… ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿฅ• ์•„์ดํ…œ 49. ์ฝœ๋ฐฑ์—์„œ this์— ๋Œ€ํ•œ ํƒ€์ž… ์ œ๊ณตํ•˜๊ธฐโ€‹

P.243 ~ P.248 ์ฐธ๊ณ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ this ๋‚ด์šฉ์ด๋ผ ์ƒ๋žต (this ๋‚ด์šฉ ์ฐธ๊ณ )

์š”์•ฝโ€‹

  • this ๋ฐ”์ธ๋”ฉ์ด ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ this๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ํƒ€์ž… ์ •๋ณด๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฅ• ์•„์ดํ…œ 50. ์˜ค๋ฒ„๋กœ๋”ฉ ํƒ€์ž…๋ณด๋‹ค๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐโ€‹

๋‹ค์Œ ์˜ˆ์ œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ ๊ฐœ๋…์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

function double(x: number | string): number | string;
function double(x: any) { return x + x; }

์„ ์–ธ์ด ํ‹€๋ฆฐ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ชจํ˜ธํ•œ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

const num = double(12); // string | number
const str = double('x'); // string | number

์„ ์–ธ๋ฌธ์—๋Š” number ํƒ€์ž…์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ๊ณ  string ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ œ๋„ˆ๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function double<T extends number | string>(x: T): T;
function double(x: any) { return x + x; }

const num = double(12); // ํƒ€์ž…์ด 12
const str = double('x'); // ํƒ€์ž…์ด "x"

์ด์ œ๋Š” ํƒ€์ž…์ด ๋„ˆ๋ฌด ๊ณผํ•˜๊ฒŒ ๊ตฌ์ฒด์ ์ž…๋‹ˆ๋‹ค. string ํƒ€์ž…์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๋ฉด string ํƒ€์ž…์ด ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

function double(x: number): number;
function double(x: string): string;
function double(x: any) { return x + x; }

const num = double(12); // ํƒ€์ž…์ด number
const str = double('x'); // ํƒ€์ž…์ด string

ํ•จ์ˆ˜ ํƒ€์ž…์ด ์กฐ๊ธˆ ๋ช…ํ™•ํ•ด์กŒ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๋Š” ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. string์ด๋‚˜ number ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ๋Š” ์ž˜ ๋™์ž‘ํ•˜์ง€๋งŒ, ์œ ๋‹ˆ์˜จ ํƒ€์ž… ๊ด€๋ จํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

function f(x: number|string) {
return double(x);
// ~ 'string|number' ํ˜•์‹์˜ ์ธ์ˆ˜๋Š” 'string' ํ˜•์‹์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ• ๋‹น๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
}

์˜ค๋ฒ„๋กœ๋”ฉ ํƒ€์ž…์˜ ๋งˆ์ง€๋ง‰ ์„ ์–ธ๊นŒ์ง€ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ, string|number ํƒ€์ž…์€ string์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์„ธ ๋ฒˆ์งธ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ํƒ€์ž… ๊ณต๊ฐ„์˜ if ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function double<T extends number | string>(x: T): T extends string ? string : number;
function double(x: any) { return x + x; }

์ด ์ฝ”๋“œ๋Š” ์ œ๋„ˆ๋ฆญ์„ ์‚ฌ์šฉํ–ˆ๋˜ ์˜ˆ์ œ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋” ์ •๊ตํ•ฉ๋‹ˆ๋‹ค.

  • T๊ฐ€ string์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์ด๋ฉด, ๋ฐ˜ํ™˜ ํƒ€์ž…์ด string์ž…๋‹ˆ๋‹ค.
  • ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์ด number์ž…๋‹ˆ๋‹ค.
const num = double(12); // ํƒ€์ž…์ด number
const str = double('x'); // ํƒ€์ž…์ด string

// function f(x: string | number): string | number
function f(x: number | string) {
return double(x);
}

์œ ๋‹ˆ์˜จ์— ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์ ์šฉํ•˜๋ฉด, ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์˜ ์œ ๋‹ˆ์˜จ์œผ๋กœ ๋ถ„๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— number | string์˜ ๊ฒฝ์šฐ์—๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋ฒ„๋กœ๋”ฉ ํƒ€์ž…์ด ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ๋ณ„๊ฐœ ํƒ€์ž…์˜ ์œ ๋‹ˆ์˜จ์œผ๋กœ ์ผ๋ฐ˜ํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž…์ด ๋” ์ •ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. ํƒ€์ž… ์˜ค๋ฒ„๋กœ๋”ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๊ฐ€๋” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์˜ค๋ฒ„๋กœ๋”ฉ ํƒ€์ž…์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐ˜๋ฉด, ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์€ ํƒ€์ž… ์ฒด์ปค๊ฐ€ ๋‹จ์ผ ํ‘œํ˜„์‹์œผ๋กœ ๋ฐ›์•„๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ ๋‹ˆ์˜จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿฅ• ์•„์ดํ…œ 51. ์˜์กด์„ฑ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ฏธ๋Ÿฌ ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐโ€‹

CSV ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. NodeJS ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜์— Buffer ํƒ€์ž…์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

function parseCSV(contents: string | Buffer): {[column: string]: string}[] {
if (typeof contents === 'object') {
// ๋ฒ„ํผ์ธ ๊ฒฝ์šฐ
return parseCSV(contents.toString('utf8'));
}
// ...
}

Buffer์˜ ํƒ€์ž… ์ •์˜๋Š” NodeJS ํƒ€์ž… ์„ ์–ธ์„ ์„ค์น˜ํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ npm install --save-dev @types/node

CSV ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณต๊ฐœํ•˜๋ฉด ํƒ€์ž… ์„ ์–ธ๋„ ํฌํ•จํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž… ์„ ์–ธ์ด @types/node์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— @types/node๋Š” devDependencies๋กœ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @types/node๋ฅผ devDependencies๋กœ ํฌํ•จํ•˜๋ฉด ๋‹ค์Œ ๋‘ ๊ทธ๋ฃน์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

  • @types์™€ ๋ฌด๊ด€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž
  • NodeJS์™€ ๋ฌด๊ด€ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์›น ๊ฐœ๋ฐœ์ž

๊ฐ์ž๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐ์  ํƒ€์ดํ•‘์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @types/node์— ์žˆ๋Š” Buffer ์„ ์–ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ๋งŒ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„  ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ์—๋Š” ์ธ์ฝ”๋”ฉ ์ •๋ณด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” toString ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

interface CsvBuffer {
toString(encoding: string): string;
}
function parseCSV(contents: string | CsvBuffer): {[column: string]: string}[] {
// ...
}

๋งŒ์•ฝ ์ž‘์„ฑ ์ค‘์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์˜์กดํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ตฌํ˜„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ํƒ€์ž…์—๋งŒ ์˜์กดํ•œ๋‹ค๋ฉด, ํ•„์š”ํ•œ ์„ ์–ธ๋ถ€๋งŒ ์ถ”์ถœํ•˜์—ฌ ์ž‘์„ฑ ์ค‘์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋„ฃ๋Š” ๊ฒƒ(๋ฏธ๋Ÿฌ๋ง, mirroring)์„ ๊ณ ๋ คํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. NodeJS ๊ธฐ๋ฐ˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋ณ€ํ™”๊ฐ€ ์—†์ง€๋งŒ, ์›น ๊ธฐ๋ฐ˜์ด๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋“ฑ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋” ๋‚˜์€ ์‚ฌ์–‘์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ฏธ๋Ÿฌ๋ง ๊ธฐ๋ฒ•์€ ์œ ๋‹› ํ…Œ์ŠคํŠธ์™€ ์ƒ์šฉ ์‹œ์Šคํ…œ ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฅ• ์•„์ดํ…œ 52. ํ…Œ์ŠคํŒ… ํƒ€์ž…์˜ ํ•จ์ •์— ์ฃผ์˜ํ•˜๊ธฐโ€‹

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

์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” map ํ•จ์ˆ˜์˜ ํƒ€์ž… ์„ ์–ธ์„ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

declare function map<U, V>(array: U[], fn: (u: U) => V): V[];

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

map(['2017', '2018', '2019'], v => Number(v));

ํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜๊ฐ’์— ๋Œ€ํ•œ ์ฒดํฌ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํ•œ ํ…Œ์ŠคํŠธ๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์•ž์˜ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ์Šคํƒ€์ผ๋กœ square๋ผ๋Š” ํ•จ์ˆ˜์˜ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

test('square a number', () => {
square(1);
square(2);
});

๋ฐ˜ํ™˜๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ์ฒดํฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ๋กœ๋Š” ์‹คํ–‰์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ํ•˜์ง€ ์•Š์€ ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ square์˜ ๊ตฌํ˜„์ด ์ž˜๋ชป๋˜์–ด ์žˆ๋”๋ผ๋„ ์ด ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

const lengths: number[] = map(['john', 'paul'], name => name.length);

์ด ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ํƒ€์ž… ์„ ์–ธ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ด€์ ์—์„œ๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. number[] ํƒ€์ž… ์„ ์–ธ์€ map ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด number[]์ž„์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ DefinitelyTyped๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ํ…Œ์ŠคํŒ…์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ ์ˆ˜๋งŽ์€ ํƒ€์ž… ์„ ์–ธ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŒ…์„ ์œ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

function assertType<T>(x: T) {}

assertType<number[]>(map(['john', 'paul'], name => name.length));

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

const n = 12;
assertType<number>(n); // ์ •์ƒ

n ์‹ฌ๋ฒŒ์„ ์กฐ์‚ฌํ•ด ๋ณด๋ฉด, ํƒ€์ž…์ด ์‹ค์ œ๋กœ ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์ธ 12์ž„์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 12๋Š” number์˜ ์„œ๋ธŒํƒ€์ž…์ด๊ณ  ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ ์ฒดํฌ๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์ฒดํฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค.

const beatles = ['john', 'paul', 'george', 'ringo'];
assertType<{ name: string }[]>(
map(beatles, name => ({
name,
inYellowSubmarine: name === 'ringo'
})),
); // ์ •์ƒ

map์€ {name: string, inYellowSubmarine: boolean} ๊ฐ์ฒด์˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์„ {name: string}[]์— ํ• ๋‹น ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, inYellowSubmarine ์†์„ฑ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด ์ฒดํฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ฒŒ๋‹ค๊ฐ€ assertType์— ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ๋ณด๋ฉด, ์ด์ƒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

const add = (a: number, b: number) => a + b;
assertType<(a: number, b: number) => number>(add);

const double = (x: number) => 2 * x;
assertType<(a: number, b: number) => number>(double); // ์ •์ƒ!?

double ํ•จ์ˆ˜์˜ ์ฒดํฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋Š” ์ด์œ ๋Š”, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋” ์ ์€ ํ•จ์ˆ˜ ํƒ€์ž…์— ํ• ๋‹น ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ์ฒ˜๋Ÿผ Parameters์™€ ReturnType ์ œ๋„ˆ๋ฆญ ํƒ€์ž…์„ ์ด์šฉํ•ด ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…๊ณผ ๋ฐ˜ํ™˜ ํƒ€์ž…๋งŒ ๋ถ„๋ฆฌํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const double = (x: number) => 2 * x;
let p: Parameters<typeof double> = null!;
assertType<number, number>(p);
// ~ '[number]' ํ˜•์‹์˜ ์ธ์ˆ˜๋Š” '[number, number]' ํ˜•์‹์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ• ๋‹น๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

let r: ReturnType<typeof double> = null!;
assertType<number>(r); // ์ •์ƒ

ํ•œํŽธ, this๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. map์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ this์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ์žˆ์œผ๋ฉฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํƒ€์ž… ์„ ์–ธ์— ๋ฐ˜์˜ํ•ด์•ผ ํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ๋„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

const beatles = ['john', 'paul', 'george', 'ringo'];
assertType<number[]>(
map(beatles, function(name, i, array) {
// ~~~~~~~~ '(name: any, i: any, array: any) => any' ํ˜•์‹์˜ ์ธ์ˆ˜๋Š”
// '(u: string) => any' ํ˜•์‹์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ• ๋‹น๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
assertType<string>(name);
assertType<number>(i);
assertType<string[]>(array);
assertType<string[]>(this);
// ~~~~ 'this'์—๋Š” ์•”์‹œ์ ์œผ๋กœ 'any' ํ˜•์‹์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
return name.length;
}),
);

๋‹ค์Œ ์ฝ”๋“œ์˜ ์„ ์–ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

declare function map<U, V>(
array: U[],
fn: (this: U[], u: U, i: number, array: U[]) => V
): V[];

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ๋ชจ๋“ˆ ์„ ์–ธ์€ ๊นŒ๋‹ค๋กœ์šด ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ์„ ์–ธ ํŒŒ์ผ์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ข‹์ง€ ์•Š์€ ์„ค๊ณ„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

declare module 'overbar';

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

ํƒ€์ž… ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์•”์‹œ์ ์œผ๋กœ any ํƒ€์ž…์„ ๋ฐœ๊ฒฌํ•ด ๋‚ด๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์–ด๋ ค์›€ ๋•Œ๋ฌธ์— ํƒ€์ž… ์ฒด์ปค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํƒ€์ž… ์„ ์–ธ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

DefinitelyTyped์˜ ํƒ€์ž… ์„ ์–ธ์„ ์œ„ํ•œ ๋„๊ตฌ๋Š” dtslint์ž…๋‹ˆ๋‹ค. dtslint๋Š” ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ์ฃผ์„์„ ํ†ตํ•ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. dtslint๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด beatles ๊ด€๋ จ ์˜ˆ์ œ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const beatles = ['john', 'paul', 'george', 'ringo'];
map(beatles, function(
name, // $ExpectType string
i, // $ExpectType number
array // $ExpectType string[]
) {
this // $ExpectType string[]
return name.length;
}); // $ExpectType number[]

dtslint๋Š” ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ์„ ์ฒดํฌํ•˜๋Š” ๋Œ€์‹  ๊ฐ ์‹ฌ๋ฒŒ์˜ ํƒ€์ž…์„ ์ถ”์ถœํ•˜์—ฌ ๊ธ€์ž ์ž์ฒด๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋น„๊ต ๊ณผ์ •์€ ํŽธ์ง‘๊ธฐ์—์„œ ํƒ€์ž… ์„ ์–ธ์„ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€๋ฐ, dtslint๋Š” ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ธ€์ž ์ž์ฒด๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. number|string๊ณผ string|number๋Š” ๊ฐ™์€ ํƒ€์ž…์ด์ง€๋งŒ ๊ธ€์ž ์ž์ฒด๋กœ ๋ณด๋ฉด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค. string๊ณผ any๋ฅผ ๋น„๊ตํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ๋ฐ, ๋‘ ํƒ€์ž…์€ ์„œ๋กœ ๊ฐ„์— ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ธ€์ž ์ž์ฒด๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค.