๐Ÿ’กํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ฑ๋Šฅ์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ํŒ ๐Ÿ’ก

kim yeeunยท2024๋…„ 9์›” 15์ผ
0
post-thumbnail

์ปดํŒŒ์ผํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ

๐Ÿ“Œ ํƒ€์ž…๊ฐ„ ๊ฒฐํ•ฉ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด type๋Œ€์‹  interface ์‚ฌ์šฉํ•˜๊ธฐ

interface Foo {
  prop: string
}

type Bar = { prop: string }

๊ฐ์ฒด์— ์‚ฌ์šฉํ•˜๋Š” type๊ณผ interface๋Š” ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํƒ€์ž…๊ฐ„ ๊ฒฐํ•ฉ์ด ํ•„์š”ํ•  ๋•Œ๋Š”, interface๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ƒ์œผ๋กœ ์œ ๋ฆฌํ•˜๋‹ค.

interface๋Š” ๋‹จ์ˆœํžˆ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ชจ์–‘์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์˜ฌ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ ํ•ฉ์ณ๋ฒ„๋ฆฌ๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ type์€ ๊ฐ์ฒด ๋ฟ ๋งŒ ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ ์›์‹œํƒ€์ž…๋„ ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ‘ํ•ฉํ•  ๋•Œ ๊ฐ์ฒด์˜ ์†์„ฑ๋“ค๊นŒ์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ํ•ฉ์ณ์•ผ ํ•œ๋‹ค.(์žฌ๊ท€์ ์ธ ํƒ€์ž… ๋จธ์ง€) ํŠนํžˆ, ๊ฐ์ฒด ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ, ๊ทธ ๋‚ด๋ถ€ ์†์„ฑ๊นŒ์ง€ ๋‹ค ํ•ฉ์ณ์•ผํ•ด์„œ ๋•Œ๋•Œ๋กœ never์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

type A = { a: string };  // A์˜ 'a' ์†์„ฑ์€ string ํƒ€์ž….
type B = { a: number };  // B์˜ 'a' ์†์„ฑ์€ number ํƒ€์ž….

์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์„ ๋ณ‘ํ•ฉํ•  ๋•Œ ํƒ€์ž…์ด ์ถฉ๋Œํ•˜๋ฉด never ํƒ€์ž…์ด ์˜ค๊ฒŒ ๋œ๋‹ค.

-> ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ์ฒด ํƒ€์ž…์„ ํ•ฉ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋ฉด, interface์˜ extends๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๐Ÿ“Œ ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉํ•˜๊ธฐ

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

declaration ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•ด์ค€๋‹ค. (incremental builds) ๋ฌผ๋ก  ํƒ€์ž… ์ถ”๋ก ์€ ๋งค์šฐ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค ์ด๊ฑธ ์ฒ˜๋ฆฌํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ, ์ฝ”๋“œ์—์„œ ์•ฝ๊ฐ„์˜ ๋ณ‘๋ชฉํ˜„์ƒ์ด ์ƒ๊ธด๋‹ค๋ฉด ๊ณ ๋ คํ•ด๋ณผ๋งŒ ํ•˜๋‹ค.

๋ณ€์ˆ˜์— ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜

let name: string = "Alice"; // name ๋ณ€์ˆ˜๋Š” string ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋ช…์‹œ
let age: number = 25;       // age ๋ณ€์ˆ˜๋Š” number ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋ช…์‹œ

ํ•จ์ˆ˜์— ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜

function greet(name: string): string {
 //  greet์€ ๋งค๊ฐœ๋ณ€์ˆ˜ name์ด string ํƒ€์ž…์ด์–ด์•ผ ํ•˜๊ณ , ๋ฐ˜ํ™˜ ๊ฐ’๋„ string ํƒ€์ž… ๋ช…์‹œ
    return `Hello, ${name}`;
}

-> ๋ฆฌํ„ดํƒ€์ž…์„ ์ง€์ •

๐Ÿ“Œ Union ๋ณด๋‹ค๋Š” Base type์„ ๋งŒ๋“ค์–ด๋‘์ž

ํƒ€์ž… union์€ ๊ฐ’์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ฃผ์ง€๋งŒ, ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

interface WeekdaySchedule {
  day: 'Monday' | 'Tuesday' | 'Wednesday' | 'Thursday' | 'Friday'
  wake: Time
  startWork: Time
  endWork: Time
  sleep: Time
}

interface WeekendSchedule {
  day: 'Saturday' | 'Sunday'
  wake: Time
  familyMeal: Time
  sleep: Time
}

declare function printSchedule(schedule: WeekdaySchedule | WeekendSchedule)

printSchedule์— ์ธ์ˆ˜๊ฐ€ ๋„˜์–ด๊ฐˆ ๋•Œ๋งˆ๋‹ค, ๊ฐ ์ธ์ˆ˜๋“ค์„ union์— ์žˆ๋Š” ํƒ€์ž…๋“ค๊ณผ ๋Œ€์กฐํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋ฌผ๋ก  ๋‹จ์ˆœํžˆ ํƒ€์ž…์ด ๋‘๊ฐœ ๋ฟ์ด๋ผ๋ฉด (์„ฑ๋Šฅ์ ์ธ ์ฐจ์ด๋Š”) ๋ฌด์‹œํ• ๋งŒํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ˆซ์ž๊ฐ€ ๋งŽ์•„์ง„๋‹ค๋ฉด, ์ปดํŒŒ์ผ ์†๋„์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, union์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๊ฐ์˜ ์š”์†Œ๋ฅผ ์Œ์œผ๋กœ ๋น„๊ตํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” 2์ฐจ์ ์œผ๋กœ ๋“œ๋Š” ๋น„์šฉ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ฒ€์‚ฌ๋Š” union์ด ์ปค์งˆ ์ˆ˜๋ก ๋”์šฑ ๋งŽ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ทœ๋ชจ๋ฅผ ์ค„์—ฌ์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด union ๋ณด๋‹ค๋Š” ํ•˜์œ„ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

interface Schedule {
  day:
    | 'Monday'
    | 'Tuesday'
    | 'Wednesday'
    | 'Thursday'
    | 'Friday'
    | 'Saturday'
    | 'Sunday'
  wake: Time
  sleep: Time
}

interface WeekdaySchedule extends Schedule {
  day: 'Monday' | 'Tuesday' | 'Wednesday' | 'Thursday' | 'Friday'
  startWork: Time
  endWork: Time
}

interface WeekendSchedule extends Schedule {
  day: 'Saturday' | 'Sunday'
  familyMeal: Time
}

declare function printSchedule(schedule: Schedule)

-> ๊ณตํ†ต์ ์ธ ๋ถ€๋ชจ ํƒ€์ž…์„ ๋งŒ๋“ค์–ด์„œ ์ƒ์†ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ™” ํ•˜์ž! ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด TypeScript๊ฐ€ ์œ ๋‹ˆ์˜จ์—์„œ ๋งค๋ฒˆ ํƒ€์ž…์„ ๋น„๊ตํ•˜๋Š” ์ผ์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ๋ ˆํผ๋Ÿฐ์Šค ์‚ฌ์šฉํ•˜๊ธฐ

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

JS์™€ TS๋ฅผ ํด๋”๋กœ ๋‚˜๋ˆˆ๋‹ค

ํ”„๋กœ์ ํŠธ์—์„œ JavaScript ํŒŒ์ผ๊ณผ TypeScript ํŒŒ์ผ์„ ํด๋”๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๊ฐ™์€ ํด๋”์— ์žˆ๋Š” ์ฝ”๋“œ์˜ ๋‚ด์šฉ์€ ์œ ์‚ฌํ•ด์•ผ ํ•œ๋‹ค

๊ธฐ๋Šฅ์ด ๋น„์Šทํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์€ ๊ฐ™์€ ํด๋” ์•ˆ์— ๋ฌถ๋Š” ๊ฒŒ ์ข‹๋‹ค. ๊ด€๋ จ์ด ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์„ž์—ฌ ์žˆ์œผ๋ฉด ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ฑฐ๋‚˜ ์ž‘์œผ๋ฉด ์ข‹์ง€ ์•Š๋‹ค

๋„ˆ๋ฌด ํฐ ํ”„๋กœ์ ํŠธ
ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋ณด๋‹ค ํ›จ์”ฌ ํฌ๋ฉด, ์ด๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก๋„๊ฐ€ ๋„ˆ๋ฌด ๋†’์•„์กŒ๋‹ค๋Š” ๊ฒฝ๊ณ  ์‹ ํ˜ธ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋” ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋„ˆ๋ฌด ์ž‘์€ ํ”„๋กœ์ ํŠธ
ํ•œ๋‘ ๊ฐœ์˜ ํŒŒ์ผ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์ˆ˜์‹ญ ๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๋กœ ์ชผ๊ฐœ๋ฉด, ์˜คํžˆ๋ ค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ƒ๊ฒจ์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. ๋น„ํšจ์œจ์ 

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

๐Ÿ“Œ tsconfig.json์ด๋‚˜ jsconfig.json ์„ค์ •ํ•˜๊ธฐ

ํŒŒ์ผ ๋ช…์‹œํ•˜๊ธฐ

ํ•ญ์ƒ ์„ค์ •ํŒŒ์ผ์ด ํ•œ๋ฒˆ์— ๋„ˆ๋ฌด ๋งŽ์€ ํŒŒ์ผ์„ ํฌํ•จํ•˜์ง€ ์•Š๋„๋ก ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

tsconfig.json์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ์„ ํŠน์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

files
include exclude

files๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹
์žฅ์ : ํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Œ.
๋‹จ์ : ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ด ๋งŽ์•„์ง€๋ฉด ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค. ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์„ค์ • ํŒŒ์ผ(tsconfig.json)์— ์ผ์ผ์ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

include/exclude๋Š” ๊ธ€๋กœ๋น™ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ํŠน์ • ํด๋”๋‚˜ ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ์™ธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
์žฅ์ : ํŒŒ์ผ์„ ์ผ์ผ์ด ์ง€์ •ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ๋œ์–ด์ค€๋‹ค.
๋‹จ์ : TypeScript๊ฐ€ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํด๋”๊ฐ€ ๋งŽ์œผ๋ฉด ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค. ํ•„์š” ์—†๋Š” .d.ts๋‚˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ํฌํ•จ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์™€ ์ปดํŒŒ์ผ ์†๋„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

exclude๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ node_modules ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ํด๋”๋ฅผ ์ œ์™ธํ•˜์ง€๋งŒ, ์ด๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌด๊ฑฐ์šด ํด๋”๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋‚ด์šฉ์€ TypeScript์˜ tsconfig.json ์„ค์ • ํŒŒ์ผ์—์„œ files์™€ include/exclude ์˜ต์…˜์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ๊ณผ ์ตœ์ ์˜ ์„ค์ • ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๋ฅผ ์‰ฝ๊ฒŒ ์š”์•ฝํ•ด๋ณผ๊ฒŒ์š”:

์š”์•ฝ:
files๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.

์žฅ์ : ํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Œ.
๋‹จ์ : ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ด ๋งŽ์•„์ง€๋ฉด ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Œ. ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์„ค์ • ํŒŒ์ผ(tsconfig.json)์— ์ผ์ผ์ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Œ.
include/exclude๋Š” ๊ธ€๋กœ๋น™ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ํŠน์ • ํด๋”๋‚˜ ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ์™ธํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.

์žฅ์ : ํŒŒ์ผ์„ ์ผ์ผ์ด ์ง€์ •ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ๋œ์–ด์คŒ.
๋‹จ์ : TypeScript๊ฐ€ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํด๋”๊ฐ€ ๋งŽ์œผ๋ฉด ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Œ. ํ•„์š” ์—†๋Š” .d.ts๋‚˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ํฌํ•จ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์™€ ์ปดํŒŒ์ผ ์†๋„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ.
exclude๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ node_modules ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ํด๋”๋ฅผ ์ œ์™ธํ•˜์ง€๋งŒ, ์ด๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌด๊ฑฐ์šด ํด๋”๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Œ.

์ตœ์ ์˜ ์„ค์ • ๋ฐฉ๋ฒ•
1. ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค ํŒŒ์ผ์ด ์žˆ๋Š” ํด๋”๋งŒ ๋ช…์‹œํ•œ๋‹ค. (์˜ˆ: src ํด๋”)
2. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค ํŒŒ์ผ๊ณผ ์„ž์ด์ง€ ์•Š๊ฒŒ ํด๋”๋ฅผ ์ž˜ ๊ตฌ๋ถ„ํ•œ๋‹ค.
3. ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ ์›๋ณธ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ํด๋”์— ๋‘๋˜, ์‰ฝ๊ฒŒ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์œ ํ•œ ์ด๋ฆ„ ํŒจํ„ด(์˜ˆ: *.test.ts)์„ ์‚ฌ์šฉํ•œ๋‹ค.
node_modules๋‚˜ ๋Œ€๊ทœ๋ชจ ๋นŒ๋“œ ํŒŒ์ผ๋“ค์€ ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์— ํฌํ•จ์‹œํ‚ค์ง€ ๋ง์ž.

{
  "compilerOptions": {
    // ...
  },
  "include": ["src"],
  "exclude": ["**/node_modules", "**/.*/"]
}

์ตœ์ƒ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์œ„ํ•ด ํด๋”๋ฅผ ์ž˜ ์ •๋ฆฌํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋Š” ์„ค์ •์„ ์ž˜ ํ•ด๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

@types

TypeScript๋Š” node_modules ํด๋”์— ์žˆ๋Š” @types ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ importํ•˜์ง€ ์•Š์•„๋„, ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํƒ€์ž… ์ •์˜๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์ž๋™์œผ๋กœ ๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, node_modules ํด๋”์— @types/node, @types/jasmine, @types/mocha ๊ฐ™์€ ํƒ€์ž… ์ •์˜ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์„ ๋•Œ, TypeScript๋Š” ์ด๋ฅผ ์ž๋™์œผ๋กœ ํฌํ•จํ•œ๋‹ค.
์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(jasmine์ด๋‚˜ mocha ๊ฐ™์€ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์˜ ํƒ€์ž…๋„ ์ž๋™์œผ๋กœ ๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค” ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ์ ?

ํŒŒ์ผ ์†๋„ ์ €ํ•˜ -> ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด๋‚˜ ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ(IDE)์˜ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ ๋Š๋ ค์ง
ํƒ€์ž… ์ถฉ๋Œ -> ํƒ€์ž…์ด ๊ฒน์ณ์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒ

๐Ÿ˜ฎ ํ•ด๊ฒฐ
๊ธ€๋กœ๋ฒŒ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์ด๋ผ๋ฉด, type ์˜ต์…˜์„ ๋น„์›Œ ๋‘ ์œผ๋กœ์จ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

// src/tsconfig.json
{
 "compilerOptions": {
   // ...

   // Don't automatically include anything.
   // Only include `@types` packages that we need to import.
   "types": []
 },
 "files": ["foo.ts"]
}

๋งŒ์•ฝ ๋ช‡๊ฐ€์ง€ ํŒจํ‚ค์ง€๊ฐ€ ๊ธ€๋กœ๋ฒŒ๋กœ ํ•„์š”ํ•˜๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

// tests/tsconfig.json
{
  "compilerOptions": {
    // ...

    // Only include `@types/node` and `@types/mocha`.
    "types": ["node", "mocha"]
  },
  "files": ["foo.test.ts"]
}

TypeScript๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ node_modules์— ์žˆ๋Š” @types ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ํฌํ•จ์‹œ์ผœ, ๊ฐœ๋ฐœ์ž๊ฐ€ importํ•˜์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํƒ€์ž…๋„ ํ”„๋กœ์ ํŠธ์— ๋กœ๋“œ๋œ๋‹ค. ๊ทธ๋ž˜์„œ type์€ ๋น„์›Œ๋‘๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋„ฃ๋Š”๋‹ค.

๐Ÿ“Œ ์ ์ง„์  ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์˜ต์…˜ ์‚ฌ์šฉํ•˜๊ธฐ

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

--incremental ์˜ต์…˜์€ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋งŒ ์ปดํŒŒ์ผํ•ด์„œ ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
composite ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ“Œ .d.ts ์ฒดํฌ ์ƒ๋žต

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด์— ์žˆ๋Š” .d.ts ํŒŒ์ผ์„ ๋ชจ๋‘ ์ฒดํฌํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์ด์Šˆ๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, .d.ts๋Š” ์ž˜ ์ž‘๋™ํ•˜๋Š” ํŒŒ์ผ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” .d.ts์˜ ์ฒดํฌ๋ฅผ ๋„๋Š” skipDefaultLibCheck ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค. (์ด๋Š” deprecated๋˜์—ˆ๋‹ค. ๊ทธ๋ƒฅ skipLibCheck์„ ์“ฐ๋ฉด ๋œ๋‹ค.)

๐Ÿ“Œ ๋น ๋ฅธ ๋ถ„์‚ฐ ๊ฒ€์‚ฌ

interface Animal {}
interface Dog extends Animal {}
interface JayG extends Dog {}

์šฐ๋ฆฌ๊ฐ€ ๋™๋ฌผ(Animal), ๊ฐ•์•„์ง€(Dog), ๊ทธ๋ฆฌ๊ณ  JayG(๊ฐ•์•„์ง€์˜ ํ•œ ์ข…๋ฅ˜)๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค. ๊ฐ ํƒ€์ž…(Animal, Dog, JayG)์ด ์žˆ๊ณ , ์ด๋“ค์ด ํƒ€์ž… ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ?

Covariance

Covariance๋Š” ๊ฐ•์•„์ง€๊ฐ€ ๋™๋ฌผ์˜ ํ•œ ์ข…๋ฅ˜๋‹ˆ๊นŒ ๊ฐ•์•„์ง€๋ฅผ ๋™๋ฌผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐœ๋…์ด๋‹ค. ์ฆ‰, ํ•˜์œ„ ํƒ€์ž…์ธ ๊ฐ•์•„์ง€๋ฅผ ์ƒ์œ„ ํƒ€์ž…์ธ ๋™๋ฌผ๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

function hello(d: Dog) {}

let dog: Dog = { name: 'hi', kind: 'mix' }
let jayg: JayG = { name: 'hi', kind: 'mix', age: 34 }

hello(dog) // ok
hello(jayg) // ok

๊ฐ•์•„์ง€๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ํ•จ์ˆ˜ hello์— ๊ฐ•์•„์ง€(Dog)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐ•์•„์ง€์˜ ํ•œ ์ข…๋ฅ˜์ธ JayG๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

Contravariance

์ƒ์œ„ ํƒ€์ž…์ธ ๋™๋ฌผ์„ ํ•˜์œ„ ํƒ€์ž…์ธ ๊ฐ•์•„์ง€๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ง์ด ์–ด๋ ต์ง€๋งŒ, ์ƒ์œ„ ํƒ€์ž…์„ ํ•˜์œ„ ํƒ€์ž…์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.

function helloDog(d: Dog) {
  console.log("๊ฐ•์•„์ง€์™€ ์ธ์‚ฌํ•ด์š”!");
}

function helloAnimal(a: Animal) {
  console.log("๋™๋ฌผ๊ณผ ์ธ์‚ฌํ•ด์š”!");
}

helloDog = helloAnimal;  // OK! ๋™๋ฌผ๊ณผ ์ธ์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๊ฐ•์•„์ง€์™€๋„ ์ธ์‚ฌํ•  ์ˆ˜ ์žˆ์–ด
helloAnimal = helloDog;  // Error! ๊ฐ•์•„์ง€์™€ ์ธ์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“  ๋™๋ฌผ๊ณผ ์ธ์‚ฌํ•  ์ˆ˜๋Š” ์—†์–ด์š”
  1. ๋™๋ฌผ์ด ํ•„์š”ํ•œ ๊ณณ์— ๊ฐ•์•„์ง€๋ฅผ ๋„ฃ๋Š” ๊ฑด ์•ˆ ๋œ๋‹ค.
  2. ํ•˜์ง€๋งŒ, ๊ฐ•์•„์ง€๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์— ๋™๋ฌผ์„ ๋„ฃ๋Š” ๊ฑด ๊ฐ€๋Šฅํ•˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋™๋ฌผ์€ ๊ฐ•์•„์ง€๋ณด๋‹ค ๋” ๋„“์€ ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Invariance

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

Bivariance

์•„๋ฌด ํƒ€์ž…์ด๋‚˜ ๋‹ค ํ—ˆ์šฉํ•œ๋‹ค.

๐Ÿค” ๊ทธ๋ž˜์„œ ?

strictFunctionTypes

์˜ต์…˜์„ ์ผœ๋ฉด ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์„œ, ์‹ค์ˆ˜๋ฅผ ์ค„์ด๊ณ  ์ปดํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค! (๋งค์ˆ˜ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด Contravariance์„ ๊ฐ•์ œํ•œ๋‹ค.)

๐Ÿ“Œ tsc ๋งŒ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ํ•ด๋ณด๊ธฐ

๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„, ์จ๋“œ ํŒŒํ‹ฐ ํˆด์ธ Gulp, Rollup, Webpack ๋“ฑ๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ๋Š๋ ค๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค. tsc --extendedDiagnostics ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ํˆด๊ฐ„์˜ ์ฃผ์š” ๋ถˆ์ผ์น˜๋ฅผ ์ฐพ์•„ ๋‚ธ๋‹ค๋ฉด, ์ž˜๋ชป๋œ ์„ค์ • ๋˜๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ถ€๋ถ„์„ ์งš์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์—ผ๋‘ํ•ด์•ผ ํ•  ์ ์€

tsc ๋‹จ๋… ์‹คํ–‰๊ณผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์—ฐ๋™ํ•œ ๋‹ค์–‘ํ•œ ๋นŒ๋“œ ํˆด ์‚ฌ์ด์— ๋นŒ๋“œ ์‹œ๊ฐ„ ์ฐจ์ด๊ฐ€ ํ˜„๊ฒฉํ•˜๊ฒŒ ๋‚˜๋Š”์ง€
๋นŒ๋“œ ํˆด์ด ์ง„๋‹จ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฐ๊ณผ์™€ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€
๋นŒ๋“œ ํˆด์— ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ์˜ต์…˜์ด ์žˆ๋Š”์ง€
๋นŒ๋“œ ํˆด์— ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ตฌ์„ฑ์ด ์žˆ๋Š”์ง€ (ts-loader ์™€ ๊ฐ™์ด)์ด๋‹ค.

๊ณต์‹ ๋ ˆํฌ ์ฐธ๊ณ 
https://github.com/microsoft/TypeScript/wiki/Performance

profile
์•ˆ๋…•ํ•˜์„ธ์š” ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด ๊น€์˜ˆ์€์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€