๐Ÿ“ ๊ธฐ์ˆ ์ฑ… ์Šคํ„ฐ๋””

23๋…„ 1์›”๋ถ€ํ„ฐ ํ™œ๋™ ์ค‘์ธ ๊ต์œก์—์„œ, ๋œป์ด ๋งž๋Š” ๋™๋ฃŒ๋“ค๊ณผ ํ•จ๊ป˜ ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ ์Šคํ„ฐ๋””
์•ž์œผ๋กœ๋„ ๊พธ์ค€ํžˆ ๊ธฐ์ˆ  ์„œ์ ์„ ์ฝ๊ณ  ํ•จ๊ป˜ ๋ฐœ์ „ํ•˜๋Š” ์‹œ๊ฐ„์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค!

1์žฅ. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

  • ๋‹ค๋ฅธ ์–ธ์–ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด ์ฝ”๋“œ ์‹คํ–‰์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์  ํƒ€์ž… ์–ธ์–ด ๋กœ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์„ ๋จผ์ € ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋Ÿฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ž์œ ๋Š” ์žฌ๋ฏธ๋ฅผ ์ฃผ๊ธฐ๋„ ํ•˜์ง€๋งŒ ์•ˆ์ •์„ฑ๋ฉด์—์„œ๋Š” ์œ„ํ—˜ ๋ถ€๋‹ด์ด ์žˆ๋‹ค.
  • JSDoc: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค ์ฝ”๋“œ์— ์ฃผ์„์„ ๋‹ฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋งˆํฌ์—… ์–ธ์–ด
/**
* Performs a pinater painting
*
* @param {Painting} painter
* @param {string} painting
* @returns {boolean} Whether the painter painted the painting.
*/
function paintPainting(painter, painting) {//...}

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…์„ ์ฃผ๋“ฏ์ด, JSDoc์„ ์ž‘์„ฑํ•ด๋‘๋ฉด ํƒ€์ž…์— ๋Œ€ํ•œ ํžŒํŠธ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜

  1. ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ๋ง‰์„ ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์ 
  2. ๋ฆฌํŒฉํ„ฐ๋ง ์ค‘ ์ƒ๊ธด ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ ๊ด€๋ จ๋œ ํ˜„์žฌ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ JSDoc ์ฃผ์„์„ ๋ชจ๋‘ ์ฐพ๋Š” ๊ฑด ์–ด๋ ต๋‹ค.
  3. ๋‹ค์†Œ ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

https://poiemaweb.com/jsdoc-type-hint

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ(superset) ๋˜๋Š” ํƒ€์ž…์ด ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

  • ๊ตฌ์„ฑ

    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ํƒ€์ž…๊ณผ ๊ด€๋ จ๋œ ๊ณ ์œ  ๊ตฌ๋ฌธ์ด ํฌํ•จ
    • ํƒ€์ž… ๊ฒ€์‚ฌ๊ธฐ: JS, TS๋กœ ์ž‘์„ฑ๋œ ํŒŒ์ผ์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ž˜๋ชป๋œ ๋ถ€๋ถ„์„ ์•Œ๋ ค์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ
    • ์ปดํŒŒ์ผ๋Ÿฌ: ํƒ€์ž… ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋ฅผ ์•Œ๋ ค์ค€ ๋’ค, ์ด์— ๋Œ€์‘๋˜๋Š” JS ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ
    • ์–ธ์–ด ์„œ๋น„์Šค: ํƒ€์ž… ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽธ์ง‘๊ธฐ(VScode, ์›น์Šคํ†ฐ ๋“ฑ)์— ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์œ ์šฉํ•œ api ์ œ๊ณต๋ฒ•์„ ์•Œ๋ ค์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ
  • ์ œํ•œ์„ ํ†ตํ•ด ๋” ์ž์œ ๋กœ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ์ฝ”๋“œ๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ์˜ ๋ฌธ์„œํ™” ex) interface

    interface Example {
    	name: string;
    	isOkay(): boolean;
    	paint(painting: string, materials: Material[]): boolean;
    }

    ์œ„์™€ ๊ฐ™์ด interface๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ Example์„ ๊ตฌํ˜„ํ•˜๋Š” class์— ์–ด๋–ค ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ์ง‘๊ธฐ๋ฅผ ๋” ๋˜‘๋˜‘ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ ์ž์ฒด๋Š” ๊ฒ€์‚ฌ์™€๋Š” ๋ณ„๋„๋กœ ์–ธ์ œ๋‚˜ JS ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ธ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ž์ฒด ์ปดํŒŒ์ผ๋Ÿฌ๋ณด๋‹จ ๋ฐ”๋ฒจ๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ๋ฒˆ๋“ค๋งํ•  ๋•Œ ํ•จ๊ป˜ ์ง„ํ–‰ํ•œ๋‹ค.

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ๊ผญ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ฑฐ๋‚˜, ๊ฐ์ฒด์ง€ํ–ฅ์„ ์จ์•ผํ•œ๋‹ค๊ฑฐ๋‚˜ ์–ด๋–ค ์ฝ”๋“œ ์Šคํƒ€์ผ ์˜๊ฒฌ์„ ๊ฐ•์š”ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ž‘๋™ ๋ฐฉ์‹์— ์ „ํ˜€ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €๋‚œ Node.js์™€ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ๊ฒฐ๊ตญ์—” JS ์ฝ”๋“œ์ด๋‹ค.

    • ts-node, ๋””๋…ธ๊ฐ€ TS ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ๋„ ์‹ค์ œ๋ก  ๋‚ด๋ถ€์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

2์žฅ. ํƒ€์ž… ์‹œ์Šคํ…œ

  • ํƒ€์ž… ๊ฒ€์‚ฌ๊ธฐ๋Š” ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ??

ํƒ€์ž…์˜ ์ข…๋ฅ˜

  • ํƒ€์ž…: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹ค๋ฃจ๋Š” ๊ฐ’์˜ ํ˜•ํƒœ ์— ๋Œ€ํ•œ ์„ค๋ช…
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฐ’์„ ํ†ตํ•ด ํƒ€์ž…์„ ์ถ”๋ก ํ•œ๋‹ค.
let a = null; // null
let b = undefined; // undefined
let c = true; // boolean
let d = 'TypeScript'; // string
let e = 1116; // number
let f = 1116n; // bigint
let g = Symbol('Jayden'); // symbol

ํƒ€์ž… ์‹œ์Šคํ…œ

  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ทœ์น™

์˜ค๋ฅ˜์˜ ์ข…๋ฅ˜

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

ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋‚˜ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ
let count = 10;
count = 'hodu'; // Type... is not assignable to type

ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜

  • ํƒ€์ž… ์ฃผ์„ ์ •๋„๋กœ ํ•ด์„ํ•˜๋ฉด ๋œ๋‹ค. ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ ๋„ ํƒ€์ž…์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
let a; // any
a = 1;
a = 'j';

// type annotation
let b: string;
b = 'j';
b = 2; // error
  • ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜ ์ค‘๋ณต
    • ๊ฐ€๊ธ‰์ ์ด๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜์—๋Š” ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
let a: string = 'jjj';

ํƒ€์ž… ํ˜•ํƒœ

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํƒ€์ž…์„ ๋ถ€์—ฌํ•œ ๊ฐ์ฒด์— ์–ด๋–ค ๋ฉค๋ฒ„ ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ๋‹ค.

๋ชจ๋“ˆ

  • ES6์— ์ถ”๊ฐ€๋œ import, export
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํŒŒ์ผ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ์Šค์ฝ”ํ”„๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
  • ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ์— a.ts, b.ts๊ฐ€ ์žˆ์„ ๋•Œ,
// a.ts
const name = 'jayden';

// b.ts
const name = 'hodu'; // ์—๋Ÿฌ ๋ฐœ์ƒ

ํ•ด๊ฒฐ๋ฒ•

  1. ํŒŒ์ผ์— export {}; ํ•ด์ฃผ๊ธฐ
  2. ํŒŒ์ผ ์†Œ์Šค์ฝ”๋“œ ์ „์ฒด๋ฅผ {} ์œผ๋กœ ๊ฐ์‹ธ์„œ block-scope๋ฅผ ๋‚˜๋ˆ ์ฃผ๊ธฐ
  3. ts ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ mts๋กœ ํ•œ๋‹ค.(๋ชจ๋“ˆ์ž„์„ ์•Œ๋ฆฌ๋Š” ๊ฒƒ)

์ถ”๊ฐ€) ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ CommonJS ์Šคํƒ€์ผ์˜ require ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ any๋กœ ์ธ์‹ํ•œ๋‹ค.


๋™๋ฃŒ๋“ค ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ์ถ”๊ฐ€

bigint ํƒ€์ž… ์ ์šฉ

  • tsconfig.js์˜ target ๊ฐ’์ด ES2020๋ณด๋‹ค ๋‚ฎ๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ ์‹œ ์ƒ์„ฑ๋˜๋Š” js์—๋Š” bigint literal์ด ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
let bigint : bigint = 0n;
//BigInt literals are not available when targeting lower than ES2020.

weak/strong vs dynamic/static

  • weak/strong typing: ํƒ€์ž…์— ๋Œ€ํ•ด ์–ด๋Š์ •๋„๋กœ ๊ฐ•ํ•˜๊ณ  ์•ฝํ•˜๊ฒŒ ๊ฒ€์‚ฌํ•˜๋Š”๊ฐ€
  • dynamic/static typing
    • dynamic: ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ค‘(๋Ÿฐํƒ€์ž„ ์ค‘)์— ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • static: ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •์—์„œ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ์ข€๋” ์ •์ ์ด์ง€๋งŒ, ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ „์— ๋ฏธ๋ฆฌ ํƒ€์ž… ์—๋Ÿฌ์— ๋Œ€์ฒ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

Donโ€™t use the terms โ€œstrongโ€ and โ€œweakโ€ typing, because they donโ€™t have a universally agreed on technical meaning ๊ธฐ์ˆ ์ ์ธ ์šฉ์–ด๋Š” ์•„๋‹ˆ๋‹ˆ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ๊ฒ ๋‹ค!

์ฐธ๊ณ