TypescriptHandBook - YDP-SPLOUNGE-CLUB/typescript-study GitHub Wiki

TypeScript Handbook

ํ•ธ๋“œ๋ถ์— ๋Œ€ํ•ด์„œ

JavaScript ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋„์ž…๋œ ์ง€ 20๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ ๊ฐ€์žฅ ๋„๋ฆฌ ํผ์ง„ cross-platform ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

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

JavaScript(JS) ๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ํฌ๊ธฐ ๋ฒ”์œ„ ๋ณต์žก์„ฑ์€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์กŒ์ง€๋งŒ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋‹จ์œ„ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” JS ์–ธ์–ด์˜ ๋Šฅ๋ ฅ์€ ๊ทธ๋ ‡์ง€ ๋ชปํ•˜๋‹ค.

TypeScript(TS) ์˜ ๋ชฉํ‘œ๋Š” JS ํ”„๋กœ๊ทธ๋žจ์˜ ์ •์  ํƒ€์ž… ๊ฐ์‹œ์ž ์ด๋‹ค. ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ ํƒ€์ž…์ด ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๋„๊ตฌ (ํƒ€์ž… ๊ฒ€์‚ฌ) ์ด๋‹ค.

ํ•ธ๋“œ๋ถ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๊ฐ€.

๋‘ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • ํ•ธ๋“œ๋ถ

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

    ์‹ค์Šต์„ ์™„๋ฃŒํ•œ ๋…์ž๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

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

ํ•ธ๋“œ๋ถ์˜ ์ฃผ์š” ๋‚ด์šฉ์€ ๋ช…ํ™•์„ฑ๊ณผ ๊ฐ„๊ฒฐ์„ฑ์„ ์œ„ํ•ด ๋ชจ๋“  ์—ฃ์ง€ ์ผ€์ด์Šค ๋˜๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํƒ๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ํ•ธ๋“œ๋ถ ๋ž˜ํผ๋Ÿฐ์Šค

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

์ž ์žฌ์ ์ธ ๋ชฉํ‘œ

ํ•ธ๋“œ๋ถ์€ ๋ช‡ ์‹œ๊ฐ„ ์•ˆ์— ํŽธํ•˜๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ„๊ฒฐํ•œ ๋ฌธ์„œ๋กœ ์ œ์ž‘๋˜์—ˆ๋‹ค. ๊ฐ„๊ฒฐํ•จ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค.

JS ์˜ ํ•จ์ˆ˜ ํด๋ž˜์Šค ํด๋กœ์ €์™€ ๊ฐ™์€ ํ•ต์‹ฌ ๊ฐœ๋…์„ ์†Œ๊ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

TS๊ฐ€ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค.


์‹ ์ž… ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ TypeScript

JS์˜ ์งง์€ ์—ญ์‚ฌ

JS๋Š” ์ฒ˜์Œ์— ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค. JS ๊ฐ€ ์ฒ˜์Œ ๋‚˜์™”์„ ๋•Œ ์ˆ˜์‹ญ ์ค„ ์ด์ƒ์˜ ์ฝ”๋“ค๋ฅด ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์ด๋ก€์ ์ธ ์ผ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์›น ํŽ˜์ด์ง€ ์† ์งง์€ ์ฝ”๋“œ๋“ค์„ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ ์—ฌ๊ฒจ์กŒ๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž๋“ค์€ ์œ„์™€ ๊ฐ™์€ ๋Š˜์–ด๋‚˜๋Š” JS ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•˜์—ฌ ์‹คํ–‰ ์—”์ง„์„ ์ตœ์ ํ™” ์‹œํ‚ค๊ณ  ์ตœ์ ํ™” ๋œ ๊ฒƒ์„ ์ด์šฉํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ํ™•์žฅํ•˜์—ฌ ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ๋งŽ์ด JS๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

ํ˜„๋Œ€ ์›น์‚ฌ์ดํŠธ์—์„œ๋Š” ์ˆ˜์‹ญ๋งŒ ์ค„์˜ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž์ฃผ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋Š” ์ •์  ํŽ˜์ด์ง€์˜ ๊ฐ„๋‹จํ•œ ๋„คํŠธ์›Œํฌ๋กœ ์‹œ์ž‘ํ•ด์„œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋งŒ์กฑ์Šค๋Ÿฌ์šธ๋งŒํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ดํ•œ ํ”Œ๋žซํผ์œผ๋กœ ์„ฑ์žฅํ•œ ์›น์˜ ๊ธธ๊ณ  ์ ์ง„์ ์ธ ์„ฑ์žฅ์ด๋‹ค.

JS ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ์ „์ฒด ์Šคํƒ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๊ณ ์žˆ๋‹ค.

JS ์˜ ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง€๋ฉด์„œ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

  • JS ๋™์ผ ์—ฐ์‚ฐ์ž๋Š” (==) ์ธ์ˆ˜๋ฅผ ๊ฐ•์ œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์„ ์œ ๋ฐœํ•œ๋‹ค.
if ("" == 0) {
    // true
}
if (1 < x < 3) {
    // x ๊ฐ’์— ์ƒ๊ด€์—†์ด true
}
  • JS๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค.
const obj = { width: 10, height: 15 };

// ์˜คํƒ€
const area = obj.width * obj.heigth;

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

๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜๋งŽ์€ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์ง€์†์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

TypeScript: ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ์ž

์•ž์„œ ๋ช‡ ์–ธ์–ด๋Š” ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์•„์˜ˆ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ–ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ถœํ•˜๋Š” ๊ฒƒ์„ ์ •์  ๊ฒ€์‚ฌ ๋ผ๊ณ  ํ•œ๋‹ค.

์–ด๋–ค ๊ฒƒ์ด ์˜ค๋ฅ˜์ธ์ง€์™€ ์–ด๋–ค ๊ฒƒ์ด ์—ฐ์‚ฐ ๋˜๋Š” ๊ฐ’์— ๊ธฐ์ธํ•˜์ง€ ์•Š์Œ์„ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ ์ด๋‹ค.

์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ์ž์ธ TS๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์ „์— ๊ฐ’์˜ ์ข…๋ฅ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ค๋ฅ˜๋ฅผ ์ฐพ๋Š”๋‹ค.

// @error: 2551
const obj = { width: 10, hegith: 15};
const area = obj.width * obj.hegiht;

ํƒ€์ž…์ด ์žˆ๋Š” JS์˜ ์ƒ์œ„ ์ง‘ํ•ฉ (A Typed Superset of JS)

TS ๋Š” JS ์™€ ์–ด๋–ค ๊ด€๊ณ„์ธ๊ฐ€.

๊ตฌ๋ฌธ (Syntax)

TS๋Š” JS์˜ ๊ตฌ๋ฌธ์ด ํ—ˆ์šฉ๋˜๋Š” JS ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ ์–ธ์–ด์ด๋‹ค. ๊ตฌ๋ฌธ์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.

ํƒ€์ž… (Types)

TS๋Š” ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐ’๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ถ”๊ฐ€๋œ ํƒ€์ž…์ด ์žˆ๋Š” ์ƒ์œ„ ์ง‘ํ•ฉ์ด๋‹ค. ์œ„์˜ obj.height ์˜ค๋ฅ˜๋Š” ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์˜ ์ข…๋ฅ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ๊ธด ์˜ค๋ฅ˜์ด๋‹ค.

console.log(4 / []);

๊ตฌ๋ฌธ์ ์œผ๋กœ ์˜ณ์€ ์œ„ ์ฝ”๋“œ๋Š” JS ์—์„œ๋Š” NaN ์„ ์ถœ๋ ฅํ•œ๋‹ค. ํ•˜์ง€๋งŒ TS ๋Š” ๋ฐฐ์—ด๋กœ ์ˆซ์ž๋ฅผ ๋‚˜๋ˆ„๋Š” ์—ฐ์‚ฐ์ด ์˜ณ์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

// @error: 2363
console.log(4 / []);

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

๋Ÿฐํƒ€์ž„ ํŠน์„ฑ (Runtime Behavior)

TS ๋Š” JS ์˜ ๋Ÿฐํƒ€์ž„ ํŠน์„ฑ์„ ๊ฐ€์ง„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. JS ์—์„œ 0์œผ๋กœ ๋‚˜๋ˆ„๋Š” ํ–‰๋™์€ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  Infinity ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. TS๋Š” JS ์ฝ”๋“œ์˜ ๋Ÿฐํƒ€์ž… ํŠน์„ฑ์„ ์ ˆ๋Œ€ ๋ณ€ํ™˜์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰ TS ๊ฐ€ ์ฝ”๋“œ์— ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Œ์„ ๊ฒ€์ถœํ•ด๋„ JS ์ฝ”๋“œ๋ฅผ TS ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ์€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰์‹œํ‚ฌ ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.

JS ์™€ ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ ์ž‘๋™์„ ์ค‘๋‹จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๋ฅผ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ๋‘ ์–ธ์–ด ๊ฐ„์— ์‰ฝ๊ฒŒ ์ „ํ™˜ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ TS์˜ ๊ธฐ๋ณธ์ ์ธ ์•ฝ์†์ด๋‹ค.

์‚ญ์ œ๋œ ํƒ€์ž… (Erased Types)

๊ฐœ๋žต์ ์œผ๋กœ TS์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ ๊ฒ€์‚ฌ๋ฅผ ๋งˆ์น˜๋ฉด ํƒ€์ž…์„ ์‚ญ์ œํ•ด์„œ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค. ์ฝ”๋“œ๊ฐ€ ํ•œ ๋ฒˆ ์ปดํŒŒ์ผ ๋˜๋ฉด ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ์ผ๋ฐ˜ JS ์ฝ”๋“œ์—๋Š” ํƒ€์ž… ์ •๋ณด๊ฐ€ ์—†๋‹ค.

ํƒ€์ž… ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒƒ์€ TS ๊ฐ€ ์ถ”๋ก ํ•œ ํƒ€์ž…์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ์˜ ํŠน์„ฑ์„ ๋ณ€ํ™˜์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ์ปดํŒŒ์ผ ๋„์ค‘์—๋Š” ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์ถœ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ํƒ€์ž… ์‹œ์Šคํ…œ ์ž์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จ์ด ์—†๋‹ค.

TS ๋Š” ์ถ”๊ฐ€ ๋Ÿฐํƒ€์ž… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. TS ํ”„๋กœ๊ทธ๋žจ์€ JS ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ฐ™์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


TypeScript for JS Programmers

TS์™€ JS์˜ ๊ด€๊ณ„๋Š” ๋‹ค์†Œ ๋…ํŠนํ•˜๋‹ค TS๋Š” JS ์œ„์— ๋ ˆ์ด์–ด๋กœ์„œ ์ž๋ฆฌ์žก๊ณ  ์žˆ๋Š”๋ฐ JS์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๋ฉด์„œ ์œ„์— ์ž์ฒด ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๋ ˆ์ด์–ด๊ฐ€ TS ํƒ€์ž… ์‹œ์Šคํ…œ์ด๋‹ค.

JS๋Š” ์ด๋ฏธ string, number, object, undefined ์™€ ๊ฐ™์€ ์›์‹œ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ผ๊ด€๋˜๊ฒŒ ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ๋ฏธ๋ฆฌ ํ™•์ธํ•ด ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

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

ํƒ€์ž… ์ถ”๋ก  (Types by Inference)

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

let HelloWorld = "Hello world";

JS๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•จ์œผ๋กœ์จ TS๋Š” JS ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„๋“ค์ด๋ฉด์„œ ํƒ€์ž…์„ ๊ฐ€์ง€๋Š” ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์—์„œ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๋กœ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๊ฒƒ์ด ์œ„์˜ ์˜ˆ์ œ์—์„œ TS๊ฐ€ HelloWorld ๊ฐ€ string ์ž„์„ ์•Œ๊ฒŒ ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

ํƒ€์ž… ์ •์˜ํ•˜๊ธฐ (Defining Types)

JS๋Š” ๋‹ค์•ผ์•ˆ ๋””์ž์ธ ํŒจํ„ด์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋™์  ์–ธ์–ด์ด๋‹ค. ๋ช‡๋ช‡ ๋””์ž์ธ ํŒจํ„ด์€ ์ž๋™์œผ๋กœ ํƒ€์ž…์„ ์ œ๊ณตํ•˜๊ธฐ ํž˜๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ TS๋Š” TS ์—๊ฒŒ ํƒ€์ž…์ด ๋ฌด์—‡์ด ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๋ช…์‹œ ๊ฐ€๋Šฅํ•œ JS ์–ธ์–ด์˜ ํ™•์žฅ์„ ์ง€์›ํ•œ๋‹ค.

  • name: string ๊ณผ id: number ์„ ํฌํ•จํ•˜๋Š” ์ถ”๋ก  ํƒ€์ž…์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ 
  • interface ๋กœ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ๋ณ€์ˆ˜ ๋’ค์— : TypeName ๊ตฌ๋ฏ„์„ ์‚ฌ์šฉํ•ด JS ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ์šด interface ์˜ ํ˜•ํƒœ๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ์Œ์„ ์„ ์–ธ ๊ฐ€๋Šฅํ•˜๋‹ค.
interface User {
    name: string;
    id: number;
}

const user: User = {
    name: "Hayes",
    id: 0,
}

ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด TS๋Š” ๊ฒฝ๊ณ ๋ฅผ ์ค€๋‹ค.

JS๋Š” ํด๋ž˜์Šค์™€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๊ธฐ ๋–„๋ฌธ์— TS ๋˜ํ•œ ๋™์ผํ•˜๋‹ค. - ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๋กœ๋„ ์„ ์–ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

interface User {
  name: string;
  id: number;
}

class UserAccount {
  name: string;
  id: number;

  constructor(name: string, id: number) {
      this.name = name;
      this.id = id;
  }
}

const user: User = new UserAccount("Arthur", 1);

์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•จ์ˆ˜์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฆฌํ„ด ๊ฐ’์„ ๋ช…์‹œํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

interface User {
  name: string;
  id: number;
}

// ~~~~~~

function getAdminUser(): User {
    // ...
}

function deleteAdminUser(user: User) {
    
}

JS ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์›์‹œ ํƒ€์ž…์€ ์ด๋ฏธ ์žˆ๋‹ค. boolean, bigint, null, number, string, symbol, object, undefined

๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. TS ๋Š” ๋ช‡ ๊ฐ€์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ชฉ๋ก์„ ํ™•์žฅํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด any, unknown, never, void ๋“ฑ์ด ์žˆ๋‹ค.

ํƒ€์ž… ๊ตฌ์„ฑ (Composing Types)

๊ฐ์ฒด๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ๋” ํฌ๊ณ  ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ TS์— ํƒ€์ž…์œผ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ์žˆ๋‹ค.

์—ฌ๋Ÿฌ๊ฐ€์ง€ ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ์ƒˆ ํƒ€์ž…์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ผ์ƒ์ ์ธ ์ฝ”๋“œ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฝ”๋“œ๋Š”

Union ๊ณผ Generic ์ด ์žˆ๋‹ค.

  • ์œ ๋‹ˆ์–ธ (Unions) ์œ ๋‹ˆ์–ธ์€ ํƒ€์ž…์ด ์—ฌ๋Ÿฌ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Œ์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
type MyBool = true | false;

TS๋Š” ์ฝ”๋“œ๊ฐ€ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ด ํƒ€์ž…์„ ๊ณจ๋ผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

typeof s === "string";
Array.isArray(a);

์ œ๋„ค๋ฆญ (Generics)

TS ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด ์ œ๋„ค๋ฆญ์€ ํƒ€์ž…์— ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ฐฐ์—ด์ด ์ผ๋ฐ˜์ ์ธ ์˜ˆ์‹œ์ด๋‹ค.

type StringArray = Array<string>;
type NumberArray = Array<number>;
type ObjectWithNameArray = Array<{name: string}>;

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ  ํƒ€์ž…์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

// @errors: 2345
interface Backpack<Type> {
    add: (obj: Type) => void;
    get: () => Type;
}

// ์ด ์ค„์€ TS์— 'backpack' ์ด๋ผ๋Š” ์ƒ์ˆ˜๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ์ง€๋ฆ„๊ธธ์ด๋ฉฐ
// const backpack: Backpack<string>์ด ์–ด๋””์„œ ์™”๋Š”์ง€ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
declare const backpack: Backpack<string>;

// ์œ„์—์„œ Backpack์˜ ๋ณ€์ˆ˜ ๋ถ€๋ถ„์œผ๋กœ ์„ ์–ธํ•ด์„œ, object๋Š” string ์ด๋‹ค.
const object = backpack.get();

// backpack ๋ณ€์ˆ˜๊ฐ€ string ์ด๋ฏ€๋กœ add ํ•จ์ˆ˜์— number ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค.
backpack.add(23);

๊ตฌ์กฐ์  ํƒ€์ž… ์‹œ์Šคํ…œ (Structural Type System)

TS ์˜ ํ•ต์‹ฌ ์›์น™ ์ค‘ ํ•˜๋‚˜๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ’์ด ์žˆ๋Š” ํ˜•ํƒœ์— ์ง‘์ค‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๋–„๋–„๋กœ ๋• ํƒ€์ดํ•‘ ๋˜๋Š” ๊ตฌ์กฐ์  ํƒ€์ดํ•‘ ์ด๋ผ ํ•œ๋‹ค.

๊ตฌ์กฐ์  ํƒ€์ž… ์‹œ์Šคํ…œ์—์„œ ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋ฉด ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.

interface Point {
    x: number;
    y: number;
}

function printPoint(p: Point) {
  console.log(`${p.x}, ${p.y}`);
}

const point = { x: 12, y: 26 };
printPoint(point);

point ๋ณ€์ˆ˜๋Š” Point ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ ์ ์ด ์—†์ง€๋งŒ TS ํƒ€์ž… ๊ฒ€์‚ฌ์—์„œ point ์˜ ํ˜•ํƒœ์™€ Point ํ˜•ํƒœ๋ฅผ ๋น„๊ตํ•œ๋‹ค. ๋‘˜ ๋‹ค ๊ฐ™์€ ํ˜•ํƒœ์ด๊ธฐ ๋–„๋ฌธ์— ํ†ต๊ณผํ•œ๋‹ค.

ํ˜•ํƒœ ์ผ์น˜์—๋Š” ์ผ์น˜์‹œํ‚ฌ ๊ฐ์ฒด์˜ ํ•„๋“œ ํ•˜์œ„ ์ง‘ํ•ฉ๋งŒ ํ•„์š”ํ•˜๋‹ค.

// @errors: 2345
interface Point {
  x: number;
  y: number;
}

function printPoint(p: Point) {
  console.log(`${p.x}, ${p.y}`);
}

// -- cut --

const point3 = { x:12, y: 24, z:36 };
printPoint(point3); // prints "12 36"

const rect = {x:33, y:3, width:30, height: 30};
printPoint(rect); // prints "33 3"

const color = { hex: "#123123" };

printPoint(color); // Error

๊ตฌ์กฐ์ ์œผ๋กœ ํด๋ž˜์Šค์™€ ๊ฐ์ฒด๊ฐ€ ํ˜•ํƒœ๋ฅผ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์ฐจ์ด๊ฐ€ ์—†๋‹ค.


TypeScript for OOP Programmers

TS๋Š” C#, Java ์™€ ๊ฐ™์ด ์ •์  ํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์— ์ต์ˆ™ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ธ๊ธฐ ์žˆ๋Š” ์„ ํƒ์ด๋‹ค.

TS ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ๋” ๋‚˜์€ ์ฝ”๋“œ ์™„์„ฑ, ์˜ค๋ฅ˜์˜ ์กฐ๊ธฐ ๋ฐœ๊ฒฌ, ํ”„๋กœ๊ทธ๋žจ ๋ถ€๋ถ„ ๊ฐ„์˜ ๋” ๋ช…ํ™•ํ•œ ํ†ต์‹ ๊ณผ ๊ฐ™์ด ์ •์  ํƒ€์ดํ•‘์ด ๊ฐ€์ง€๋Š” ๋งŽ์€ ์ด์ ์„ ์ œ๊ณตํ•œ๋‹ค. TS๋Š” ์ด๋Ÿฌํ•œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ๊ธฐ๋Šฅ์„ ๋งŽ์ด ์ œ๊ณตํ•˜์ง€๋งŒ JS๊ฐ€ ๊ธฐ์กด์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ๋‹ค์‹œ ์‚ดํŽด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋” ๋‚˜์€ JS ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๊ณ , C#/JAVA ์—์„œ TS ๋กœ ๋ฐ”๋กœ ์ž…๋ฌธํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ฒช๋Š” ํ”ํ•œ ํ•จ์ •์„ ํ”ผํ• ์ˆ˜ ์žˆ๋‹ค.

JavaScript ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ธฐ (Co-learning JS)

๋งŒ์•ฝ JS์— ์ต์ˆ™ํ•˜์ง€๋งŒ ์ฃผ๋กœ Java C# ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋ฉด ํ”ํžˆ ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ•ด์™€ ํ•จ์ •์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋  ๊ฒƒ์ด๋‹ค. TS ๋ชจ๋ธ์ด ์œ ํ˜•ํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ์ผ๋ถ€๋Š” Java ๋‚˜ C# ๊ณผ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๋‹ค. TS ํ•™์Šตํ•˜๋Š” ๋ฐ์— ์žˆ์–ด ์ด ๋ถ€๋ถ„์„ ์—ผ๋‘ํ•ด ๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

JS๋ฅผ ๊ฒฝํ—˜ํ•˜์ง€ ์•Š์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋ฉด JS ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„ ์ ์œผ๋กœ ํƒ€์ž…์„ ์ œ์™ธํ•œ JS ์ผ๋ถ€๋ถ„์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

TS๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ฐ”๊พธ์ง€ ์•Š๊ธฐ ๋–„๋ฌธ์— ์‹ค์ œ๋กœ ๋ฌด์–ธ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ์ „ํžˆ JS๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ฐฐ์›Œ์•ผ ํ•œ๋‹ค.

TS๊ฐ€ JS์™€ ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํŠน์ •ํ•œ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋ฆฌ์†Œ์Šค๋Š” ํ•ญ์ƒ TS ํ”„๋กœ๊ทธ๋žจ์— ๋˜‘๊ฐ™์ด ์ž˜ ์ ์šฉ๋œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. TS์— ํŠน์ •๋œ ๋ฆฌ์†Œ์Šค์—๋งŒ ์ œํ•œ์„ ๋‘๋ฉด ์•ˆ๋œ๋‹ค.

ํด๋ž˜์Šค ๋‹ค์‹œ ์ƒ๊ฐํ•˜๊ธฐ (Rethinking the Class)

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

์ž์œ ๋กœ์šด ํ•จ์ˆ˜์™€ ๋ฐ์ดํ„ฐ

JS์—์„œ ํ•จ์ˆ˜๋Š” ์–ด๋””์—๋‚˜ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•œ class ๋‚˜ struct ์— ์†ํ•˜์ง€ ์•Š๊ณ  ์ž์œ ๋กญ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์œ ์—ฐ์„ฑ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๋‹ค. OOP ๊ณ„์ธต๊ณผ ์ƒ๊ด€ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” "์ž์œ ๋กœ์šด" ํ•จ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ JS ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋ธ๋กœ ์„ ํ˜ธ๋œ๋‹ค.

์ •์  ํด๋ž˜์Šค

์ถ”๊ฐ€์ ์œผ๋กœ C#๊ณผ Java ์˜ ์‹ฑ๊ธ€ํ„ด๊ณผ ์ •์  ํด๋ž˜์Šค ๊ฐ™์€ ํŠน์ • ๊ตฌ์กฐ๋Š” TS์—์„œ ํ•„์š”์—†๋‹ค.

TS ์˜ OOP

์›ํ•œ๋‹ค๋ฉด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ์ผ๋ถ€ ๋ฌธ์ œ๋Š” ๊ธฐ์กด์˜ OOP ๊ณ„์ธต์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์ ํ•ฉํ•˜๋ฉฐ TS๊ฐ€ JS์˜ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ชจ๋ธ์„ ๋”์šฑ ๋” ํšจ๊ณผ์ ์œผ๋กœ ๋งŒ๋“ ๋‹ค. TS๋Š” ์ธํ„ฐํŽ˜์ด์Šค, ์ƒ์†, ์ •์  ๋ฉ”์„œ๋“œ ๊ตฌํ˜„๊ณผ ๊ฐ™์€ ๋งŽ์€ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์„ ์ง€์›ํ•œ๋‹ค.

ํƒ€์ž… ๋‹ค์‹œ ์ƒ๊ฐํ•˜๊ธฐ

TS์˜ ํƒ€์ž…์— ๋Œ€ํ•œ ์ดํ•ด๋Š” C#, Java ์™€ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๋‹ค ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์„ ์‚ดํŽด๋ณด์ž.

์ง‘ํ•ฉ์œผ๋กœ์„œ ํƒ€์ž…

C#, Java ์—์„œ ๋Ÿฐํƒ€์ž„ ํƒ€์ž…๊ณผ ํ•ด๋‹น ์ปดํŒŒ์ผ ํƒ€์ž… ์„ ์–ธ ์‚ฌ์ด์˜ ์ผ๋Œ€์ผ ๋Œ€์‘๊ด€๊ณ„๋Š” ์ค‘์š”ํ•˜๋‹ค. TS ์—์„œ ํƒ€์ž…์€ ๊ณตํ†ต์˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฐ’์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํƒ€์ž…์€ ์ง‘ํ•ฉ์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋–„๋ฌธ์— ํŠน์ •ํ•œ ๊ฐ’์€ ๋™์‹œ์— ์ˆ˜๋งŽ์€ ์ง‘ํ•ฉ์— ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํƒ€์ž…์„ ์ง‘ํ•ฉ์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ํŠน์ • ์—ฐ์‚ฐ์ด ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฌ์›Œ์ง„๋‹ค. C# ์—์„œ๋Š” string ๊ณผ int ๋‘˜ ๋‹ค ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ’์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•˜๋‹ค.

TS์—์„œ ๋ชจ๋“  ํƒ€์ž…์ด ๋‹จ์ˆœํžˆ ์ง‘ํ•ฉ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๋Š” ์ˆœ๊ฐ„ ์ด๋Š” ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฌ์›Œ์ง„๋‹ค. string ์ง‘ํ•ฉ ๋˜๋Š” number ์ง‘ํ•ฉ์— ์†ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์„ค๋ช…ํ•  ๊ฒƒ์ธ๊ฐ€.

๋‹จ์ˆœํžˆ ์œ ๋‹ˆ์–ธ์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. 'string' | 'union'

TS๋Š” ์ง‘ํ•ฉ๋ก ์— ์˜๊ฑฐํ•ด ํƒ€์ž…์„ ์ด์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋ฉฐ ํƒ€์ž…์„ ์ง‘ํ•ฉ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๋” ์ง๊ด€์ ์ด๋‹ค.

์‚ญ์ œ๋œ ๊ตฌ์กฐ์  ํƒ€์ž…

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

interface PointLike {
    x: number;
    y: number;
}
interface Named {
    name: string;
}

function printPoint(point: PointLike) {
  console.log(`x ${point.x}, y ${point.y}`);
}

function printName(x: Named) {
  console.log(`Hello ${x.name}`);
}

const obj = {
  x: 0,
  y: 1,
  name: "Origin"
};

printName(obj);
printPoint(obj);

TS ํƒ€์ž… ์‹œ์Šคํ…œ์€ ๋ช…๋ชฉ์ด ์•„๋‹Œ ๊ตฌ์กฐ์ ์ด๋‹ค. obj ๋Š” ์ˆซ์ž์ธ x,y ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ PointLike ๋กœ์จ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ํƒ€์ž…๊ฐ„์˜ ๊ด€๊ณ„๋Š” ํŠน์ • ๊ด€๊ณ„๋กœ ์„ ์–ธ๋˜์—ˆ๋Š”์ง€๊ฐ€ ์•„๋‹Œ, ํฌํ•จ๋œ ํ”„๋กœํผํ‹ฐ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.

TS์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ๋˜ํ•œ ๊ตฌ์ฒดํ™”๋˜์ง€ ์•Š์•˜๋‹ค. ๋Ÿฐํƒ€์ž„์— obj ๊ฐ€ PointLike ์ž„์„ ์•Œ๋ ค์ฃผ์ง€ ์•Š์•˜๋‹ค. ์‚ฌ์‹ค PointLike ํƒ€์ž…์€ ๋Ÿฐํƒ•๋ฏธ์— ์–ด๋–ค ํ˜•ํƒœ๋กœ๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ง‘ํ•ฉ์œผ๋กœ์„œ ํƒ€์ž… ๊ฐœ๋…์œผ๋กœ ๋ณด๋ฉด obj๋ฅผ PointLike ๊ฐ’ ์ง‘ํ•ฉ์ด๋‚˜ Named ๊ฐ’ ์ง‘ํ•ฉ์˜ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์กฐ์  ํƒ€์ž…ํ™”์˜ ๊ฒฐ๊ณผ

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ข…์ข… ๊ตฌ์กฐ์  ํƒ€์ž…ํ™”์˜ ๋‘ ๊ฐ€์ง€ ์ธก๋ฉด์— ๋†€๋ผ๊ณค ํ•œ๋‹ค.

๋นˆ ํƒ€์ž… (Empty Types)

์ฒซ ๋ฒˆ์งธ๋กœ ๋นˆ ํƒ€์ž…์€ ์˜ˆ์ƒ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

class Empty {};

function fn(arg: Empty) {
    // some
}

// isEmpty???
fn({k: 10});

TS๋Š” ์ฃผ์–ด์ง„ ์ธ์ˆ˜๊ฐ€ ์œ ํšจํ•œ Empty ์ธ์ง€ ํ™•์ธํ•˜์—ฌ fn ์˜ ํ˜ธ์ถœ์ด ์œ ํšจํ•œ์ง€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. Empty ์— ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ Empty ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์†ํ•ด์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์œ ํšจํ•œ ํ˜ธ์ถœ์ด๋‹ค.

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

๊ตฌ์กฐ์  ํƒ€์ž… ์‹œ์Šคํ…œ์€ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์˜ ์†์„ฑ์„ ๊ฐ–๋Š” ์ธก๋ฉด์—์„œ ํ•˜์œ„ ํƒ€์ž…์„ ์„ค๋ช…ํ•˜๋ฏ€๋กœ ๊ด€๊ณ„๋ฅผ ์•”์‹œ์ ์œผ๋กœ ๊ตฌ๋ณ„ํ•œ๋‹ค.

๋™์ผํ•œ ํƒ€์ž…

class Car {
    drive() {
        // ~~
    }
};

class Golfer {
    drive() {
        // ~~
    }
}

// No error?
let w: Car = new Golfer();

์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์ด์œ ๋Š” ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

๋ฐ˜์˜

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ œ๋„ค๋ฆญ์„ ํฌํ•จํ•˜์—ฌ ์–ด๋–ค ๊ฐ’์˜ ์œ ํ˜•์ด๋ผ๊ณ  ๋‹ค๋ฅผ์ˆ˜ ์žˆ์Œ์ด ์ต์ˆ™ํ•˜๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ