๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

typescript

TypeScript / ๊ฐœ์š”

TypeScript

JavaScript์— ์ •์  ํƒ€์ดํ•‘๊ณผ ์„ ํƒ์  ํƒ€์ž… annotation์ด ์ถ”๊ฐ€๋œ ์–ธ์–ด๋กœ, ํฐ ์Šค์ผ€์ผ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์„ค๊ณ„๋จ

 

 

ํŠน์ง•

  • ์ƒ์œ„ ์ง‘ํ•ฉ : JavaScript์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์œผ๋กœ, ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฝ”๋“œ๋Š” ๊ตฌ๋ฌธ์ ์œผ๋กœ ์œ ํšจํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์ž„
  • ํฌ๋กœ์Šค ํ”Œ๋žซํผ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋จ
  • ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด : ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ชจ๋“ˆ ๊ฐ™์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ : ์ •์  ํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•ด annotation(ํƒ€์ž… ์ฃผ์„)์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋จ => ์ปดํŒŒ์ผ ์‹œ ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งค๋ฒˆ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ์˜ค๋ฅ˜ ์ฐพ๊ธฐ๊ฐ€ ์‰ฌ์›€
  • ํƒ€์ž… ์ถ”๋ก  : ๋ณ€์ˆ˜๊ฐ€ ํƒ€์ž… ์—†์ด ์„ ์–ธ๋˜๋ฉด ๊ทธ ๊ฐ’์— ๊ธฐ๋ฐ˜ํ•ด ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต
  • ์„ ํƒ์  ์ •์  ํƒ€์ดํ•‘ : ์ •์  ํƒ€์ž…์ด ์„ ํƒ์ ์ž„

* Type Annotation(ํƒ€์ž… ์ฃผ์„) : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๊ฐ์ฒด ๋“ฑ์— ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• -> ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ€์ž… ๊ฒ€์‚ฌ ์ˆ˜ํ–‰

 

 

JS vs TS

ํŠน์ง• JS TS
ํƒ€์ž… ์‹œ์Šคํ…œ ๋™์  ํƒ€์ž… / ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •๋จ ์ •์  ํƒ€์ž… / ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฒฐ์ •๋จ
ํƒ€์ž… ์•ˆ์ •์„ฑ ๋‚ฎ์Œ / ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ ๋†’์Œ / ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ๋Œ€๋ถ€๋ถ„ ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ๋ฐœ๊ฒฌ
์ปดํŒŒ์ผ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด / ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ํ•ด์„๋จ ์ปดํŒŒ์ผ ์–ธ์–ด / TS๊ฐ€ JS๋กœ ์ปดํŒŒ์ผ๋ผ ์‹คํ–‰
ํ•™์Šต ๊ณก์„  ๋น„๊ต์  ์‰ฌ์›€ JS๋ณด๋‹ค ์–ด๋ ค์›€ ํƒ€์ž… ์‹œ์Šคํ…œ ๋ฐ ์ถ”๊ฐ€ ๋ฌธ๋ฒ• ํ•™์Šต ํ•„์š”
์ธํ„ฐํŽ˜์ด์Šค์™€ ์ œ๋„ค๋ฆญ X ์ง€์› O
ํ˜ธํ™˜์„ฑ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์™€ ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์› JS๋กœ ์ปดํŒŒ์ผ๋˜๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅ

 

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

  • ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ถ„๋ฅ˜์ฒด๊ณ„
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ์ •์žฅ๋˜๊ณ  ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ •์˜
  • ์•ˆ์ •์„ฑ ๋ฐ ์‹ ๋ขฐ์„ฑ ํ™•๋ณด๊ฐ€ ๋ชฉ์ 

ํ•ต์‹ฌ ๊ฐœ๋…

๊ฐœ๋… ์„ค๋ช…
ํƒ€์ž… ์•ˆ์ •์„ฑ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์˜ˆ์ƒ๋œ ํƒ€์ž…๋Œ€๋กœ๋งŒ ๋™์ž‘ํ•˜๋„๋ก ๋ณด์žฅ → ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋™์ž‘ ๋ฐฉ์ง€
ํƒ€์ž… ์ถ”๋ก  ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ํƒ€์ž…์„ ์œ ์ถ”
์ •์  ํƒ€์ž… ์ปดํŒŒ์ผ ํƒ€์ž„์— ํƒ€์ž…์ด ๊ฒฐ์ •๋จ → ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ํƒ์ง€ ๊ฐ€๋Šฅ
์ œ๋„ค๋ฆญ(generics) ๋‹ค์–‘ํ•œ ํƒ€์ž…์— ๋Œ€ํ•ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ → ์œ ์—ฐ์„ฑ + ํƒ€์ž… ์•ˆ์ •์„ฑ ํ™•๋ณด

 

์ž‘๋™ ์›๋ฆฌ

  1. ํŒŒ์‹ฑ (Parsing)
    • TypeScript ์ปดํŒŒ์ผ๋Ÿฌ(tsc)๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(AST)๋ฅผ ์ƒ์„ฑ
  2. ํƒ€์ž… ๊ฒ€์‚ฌ (Type Checking)
    • AST๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋ชจ๋“  ๋ณ€์ˆ˜/ํ•จ์ˆ˜/ํ‘œํ˜„์‹์˜ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ฑฐ๋‚˜ ํ™•์ธ
    • ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
  3. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์ƒ์„ฑ (Emit)
    • ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๋๋‚œ ๋’ค, ํƒ€์ž… ์ •๋ณด(์ฃผ์„)๋Š” ์ œ๊ฑฐ๋จ
    • ์ˆœ์ˆ˜ JavaScript ์ฝ”๋“œ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋จ

 

 


 

 

TypeScript ์„ค์น˜

๊ณต์‹ ์‚ฌ์ดํŠธ ์ฐธ๊ณ  : https://www.typescriptlang.org/ 

 

# ์ „์—ญ์œผ๋กœ ์„ค์น˜
npm install -g typescript@5.3.3
# -----------------
# ๊ฐœ๋ฐœ ์˜์กด์„ฑ์œผ๋กœ ์„ค์น˜ํ•  ๊ฒฝ์šฐ
npm i --save-dev typescript

 

์„ค์น˜ํ•œ ํ›„ ํ™•์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋‹ค

# ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฒ„์ „ ํ™•์ธ
tsc --version
# command not found~ ๋ฉ”์‹œ์ง€์˜ ๊ฒฝ์šฐ
npx tsc --version

 

๊ทธ๋‹ค์Œ์— ํ™˜๊ฒฝ์„ค์ • ํŒŒ์ผ์ธ tsconfig.json์„ ์ƒ์„ฑํ•œ๋‹ค. *tsconfig.json : ts ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ์˜ต์…˜, ํƒ€์ผ“ ํ™˜๊ฒฝ ๋“ฑ์„ ์ง€์ •

# TS ์ปดํŒŒ์ผ๋Ÿฌ ์„ค์ •(tsconfig.json ์ƒ์„ฑ)
tsc --init

# ํ…Œ์ŠคํŠธ์šฉ index.ts ํŒŒ์ผ ์ƒ์„ฑ (์ž‘์—…ํ•˜๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด์—์„œ)
touch index.ts

 

tsconfig.json

{
  "compilerOptions": {
    "target": "es2016", // ์ถœ๋ ฅ JavaScript์˜ ๋ฌธ๋ฒ• ๋ฒ„์ „ (์˜ˆ: async/await ๊ฐ€๋Šฅ)
    "module": "commonjs", // Node.js ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ
    "esModuleInterop": true, // CommonJS ๋ชจ๋“ˆ์„ ES6 ์Šคํƒ€์ผ(import ...)๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
    "forceConsistentCasingInFileNames": true, // ๋Œ€์†Œ๋ฌธ์ž ์ผ๊ด€์„ฑ ์—†์œผ๋ฉด ์˜ค๋ฅ˜ (ex: import์™€ ์‹ค์ œ ํŒŒ์ผ๋ช…์ด ๋‹ค๋ฅผ ๋•Œ)
    "strict": true, // ์—„๊ฒฉํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ ์ „์ฒด๋ฅผ ์ผฌ (์•„๋ž˜ ๋ชจ๋“  strict ๊ณ„์—ด ์˜ต์…˜ ํฌํ•จ)
    "skipLibCheck": true, // node_modules ์•ˆ์˜ .d.ts ํŒŒ์ผ ํƒ€์ž… ๊ฒ€์‚ฌ๋Š” ์ƒ๋žต (๋นŒ๋“œ ์†๋„ ํ–ฅ์ƒ)
    "outDir": "dist", // ์ปดํŒŒ์ผ๋œ JS ํŒŒ์ผ์ด ๋‚˜์˜ฌ ํด๋”
    "noUncheckedIndexedAccess": true // ๊ฐ์ฒด์˜ ์ธ๋ฑ์‹ฑ ํƒ€์ž… ์ ‘๊ทผ ์‹œ undefined ํฌํ•จํ•˜๋„๋ก ๊ฐ•์ œํ•จ (์•ˆ์ •์„ฑ ↑)
    // "lib": ["ES2022", "DOM"] // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋นŒํŠธ์ธ API ํƒ€์ž… ์ •์˜ (์˜ˆ: Promise, Map ๋“ฑ)
  },
  "include": ["src/**/*"] // ์ปดํŒŒ์ผ์— ํฌํ•จํ•  ํŒŒ์ผ ๊ฒฝ๋กœ๋“ค (์—ฌ๊ธฐ์„  src ํด๋” ํ•˜์œ„ ๋ชจ๋‘)
}

 

index.ts

function hello(name: string) {
  console.log(`Hello ${name}`);
}

hello('Typescript');

 

์ด๋ฅผ ์ด์ œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค.

tsc index.ts

 

index.js๊ฐ€ ์ƒ์„ฑ๋จ

 

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์ปดํŒŒ์ผ๋œ js ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋œ๋‹ค.

node index.js

 

 

 

 

'typescript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TypeScript / ์ œ๋„ค๋ฆญ  (2) 2025.06.05
TypeScript / ํด๋ž˜์Šค  (0) 2025.06.05
TypeScript / ํƒ€์ž… ์ถ”๋ก , ํƒ€์ž… ๋‹จ์–ธ  (0) 2025.06.05
TypeScript / ํƒ€์ž…(2)  (0) 2025.06.04
TypeScript / ํƒ€์ž… (1)  (0) 2025.06.04