(๋ฌ๋ ํ์ ์คํฌ๋ฆฝํธ) 1~2์ฅ
๐ ๊ธฐ์ ์ฑ ์คํฐ๋
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์ ์์ฑํด๋๋ฉด ํ์ ์ ๋ํ ํํธ๋ฅผ ์ ๊ณต๋ฐ์ ์ ์๋ค.
๊ทธ๋ฌ๋
- ์๋ชป๋ ์ฝ๋๋ฅผ ๋ง์ ์๋ ์๋ค๋ ์
- ๋ฆฌํฉํฐ๋ง ์ค ์๊ธด ๋ณ๊ฒฝ์ฌํญ๊ณผ ๊ด๋ จ๋ ํ์ฌ๋ ์ ํจํ์ง ์์ JSDoc ์ฃผ์์ ๋ชจ๋ ์ฐพ๋ ๊ฑด ์ด๋ ต๋ค.
- ๋ค์ ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์ค๋ช ํ๊ธฐ ์ด๋ ต๋ค.
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'; // ์๋ฌ ๋ฐ์
ํด๊ฒฐ๋ฒ
- ํ์ผ์
export {};
ํด์ฃผ๊ธฐ - ํ์ผ ์์ค์ฝ๋ ์ ์ฒด๋ฅผ
{}
์ผ๋ก ๊ฐ์ธ์ block-scope๋ฅผ ๋๋ ์ฃผ๊ธฐ - 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 ๊ธฐ์ ์ ์ธ ์ฉ์ด๋ ์๋๋ ์ฌ์ฉ์ ์ง์ํด์ผ๊ฒ ๋ค!