Reviews 🧐/Books

[νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν”„λ‘œκ·Έλž˜λ° review] 2μž₯ νƒ€μž…μŠ€ν¬λ¦½νŠΈ: 3,000λ―Έν„° μƒκ³΅μ—μ„œ 내렀닀보기

leejaejae 2023. 12. 12. 15:18

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ— κ΄€ν•΄ κΆκΈˆν•˜λ˜ μ°°λ‚˜ <<νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν”„κ³ κ·Έλž˜λ°>>이 μž…λ¬Έμžκ°€ μ‹œμž‘ν•˜κΈ°μ— μ˜ˆμ‹œλ„ 많고 μ„€λͺ…이 μΉœμ ˆν•˜λ‹€κ³  ν•΄μ„œ 이 μ±…μœΌλ‘œ νƒ€μž„μŠ€ν¬λ¦½νŠΈ μž…λ¬Έμ— λ„μ „ν•˜κ³ μž ν•œλ‹€.


λͺ©μ°¨

2.1 컴파일러
2.2 νƒ€μž… μ‹œμŠ€ν…œ
2.3 μ½”λ“œ νŽΈμ§‘κΈ° μ„€μ •
2.4 index.js


2.1 컴파일러

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λ‹€λ₯Έ 언어와 달리 μ»΄νŒŒμΌλŸ¬κ°€ μ½”λ“œλ₯Ό λ°”μ΄νŠΈμ½”λ“œ λŒ€μ‹  μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ λ³€ν™˜ν•œλ‹€. μ΄ν›„λ‘œλŠ” 일반적인 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ“―μ΄ λΈŒλΌμš°μ €, NodeJS λ“±μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬λŠ” ASTλ₯Ό λ§Œλ“€μ–΄ κ²°κ³Ό μ½”λ“œλ₯Ό 내놓기 전에 νƒ€μž… 확인을 κ±°μΉœλ‹€. νƒ€μž… 확인 덕뢄에 νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œκ·Έλž¨μ΄ 개발자의 κΈ°λŒ€λŒ€λ‘œ 싀행될 수 있게 ν•΄μ£Όκ³ , λͺ…λ°±ν•œ μ‹€μˆ˜κ°€ 듀어가지 μ•Šκ²Œ 방지해쀀닀.

더보기

νƒ€μž… 검사기(typechecker)

μ½”λ“œμ˜ νƒ€μž… μ•ˆμ „μ„±μ„ κ²€μ¦ν•˜λŠ” νŠΉλ³„ν•œ ν”„λ‘œκ·Έλž¨


νƒ€μž… 확인과 μžλ°”μŠ€ν¬λ¦½νŠΈ 방좜 뢀뢄을 ν¬ν•¨ν•˜λ©΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일 과정은 λŒ€λž΅ μ•„λž˜μ™€ κ°™λ‹€.

κ³Όμ • 1~3은 TSCκ°€ μˆ˜ν–‰ν•˜λ©°, κ³Όμ • 4~6은 λΈŒλΌμš°μ €, NodeJS, 기타 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진 같은 μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„μ΄ μ‹€ν–‰ν•œλ‹€.

κ³Όμ • 1~2μ—μ„œ μ†ŒμŠ€ μ½”λ“œμ— μ‚¬μš©λœ νƒ€μž…μ„ μ΄μš©ν•˜μ§€λ§Œ, κ³Όμ • 3μ—μ„œλŠ” μ΄μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. λ‹€μ‹œ 말해, TSCκ°€ νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ μ»΄νŒŒμΌν•  λ•ŒλŠ” κ°œλ°œμžκ°€ μ‚¬μš©ν•œ νƒ€μž…μ€ ν™•μΈν•˜μ§€ μ•ŠλŠ”λ‹€.(κ°œλ°œμžκ°€ μ‚¬μš©ν•œ νƒ€μž…μ€ 단지 νƒ€μž…μ„ ν™•μΈν•˜λŠ” 데만 μ“°μΈλ‹€λŠ” 뜻)

 

2.2 νƒ€μž… μ‹œμŠ€ν…œ

더보기

νƒ€μž… μ‹œμŠ€ν…œ(type system)

νƒ€μž… 검사기가 ν”„λ‘œκ·Έλž¨μ— νƒ€μž…μ„ ν• λ‹Ήν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” κ·œμΉ™ 집합

νƒ€μž… μ‹œμŠ€ν…œμ€ 보톡 두 가지 μ’…λ₯˜. νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 두 가지 μ‹œμŠ€ν…œ λͺ¨λ‘μ˜ 영ν–₯을 λ°›λŠ”λ‹€.(즉, κ°œλ°œμžλŠ” νƒ€μž…μ„ λͺ…μ‹œν•˜κ±°λ‚˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ μΆ”λ‘ ν•˜λ„λ‘ ν•˜λŠ” 방식 μ€‘μ—μ„œ 선택할 수 있음)

1. μ–΄λ–€ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ”μ§€λ₯Ό μ»΄νŒŒμΌμ— λͺ…μ‹œμ μœΌλ‘œ μ•Œλ €μ£ΌλŠ” νƒ€μž… μ‹œμŠ€ν…œ: μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©

// μ–΄λ…Έν…Œμ΄μ…˜μ€ 'value: type' ν˜•μ±„λ‘œ μ“°μž„

let a: number = 1  // aλŠ” number
let b: string = 'hello'  // bλŠ” string
let cL boolean[] = [true, false]  // cλŠ” boolean λ°°μ—΄

2. μžλ™μœΌλ‘œ νƒ€μž…μ„ μΆ”λ‘ ν•˜λŠ” νƒ€μž… μ‹œμŠ€ν…œ: μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš© X
- νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ νƒ€μž…μ„ μΆ”λ‘ ν•˜λ„λ‘ λ‘λŠ” 것이 μ½”λ“œλ₯Ό 쀄일 수 μž‡λŠ” λ°©λ²•μ΄λ―€λ‘œ 보톡 μ΄λ…Έν…Œμ΄μ…˜μ€ μƒλž΅ν•¨

let a = 1  // aλŠ” number
let b = 'hello'  // bλŠ” string
let c = [true, false]  // cλŠ” boolean λ°°μ—΄


2.2.1 νƒ€μž…μŠ€ν¬λ¦½νŠΈ VS μžλ°”μŠ€ν¬λ¦½νŠΈ

1) νƒ€μž…μ€ μ–΄λ–»κ²Œ κ²°μ •λ˜λŠ”κ°€?

동적 νƒ€μž… 바인딩(dynamic type binding)μ΄λž€ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•΄μ•Όλ§Œ νŠΉμ • 데이터 νƒ€μž…μ„ μ•Œ 수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ° μ „μ—λŠ” νƒ€μž…μ„ μ•Œ 수 μ—†λ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μ μ§„μ μœΌλ‘œ νƒ€μž…μ„ ν™•μΈν•˜λŠ”(gradually typed) μ–Έμ–΄λ‹€. 즉, νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 컴파일 νƒ€μž„μ— ν”„λ‘œκ·Έλž¨μ˜ λͺ¨λ“  νƒ€μž…μ„ μ•Œκ³  μžˆμ„ λ•Œ μ΅œμƒμ˜ κ²°κ³Όλ₯Ό 보여쀄 수 μžˆμ§€λ§Œ, ν”„λ‘œκ·Έλž¨μ„ μ»΄νŒŒμΌν•˜λŠ” 데 λ°˜λ“œμ‹œ λͺ¨λ“  νƒ€μž…μ„ μ•Œμ•„μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.
νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ€ ν”„λ‘œκ·Έλž¨μ΄λΌλ„ 그쀑 일뢀 νƒ€μž…μ„ μΆ”λ‘ ν•΄μ„œ 였λ₯˜λ₯Ό κ²€μΆœν•  수 μžˆμ§€λ§Œ, λͺ¨λ“  νƒ€μž…μ„ μ•Œμ§€ λͺ»ν•˜λŠ” μƒν™©μ—μ„œλŠ” λ§Žμ€ 였λ₯˜κ°€ μ‚¬μš©μžμ—κ²Œ κ·ΈλŒ€λ‘œ λ…ΈμΆœλ  수 μžˆλ‹€. 

점진적 νƒ€μž… 확인은 νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ€ κΈ°μ‘΄ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•  λ•Œ 특히 유용.(ν•˜μ§€λ§Œ μ½”λ“œλ₯Ό λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜λŠ” 상황이 μ•„λ‹ˆλΌλ©΄ λͺ¨λ“  μ½”λ“œμ˜ νƒ€μž…μ„ 컴파일 νƒ€μž„μ— μ§€μ •ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ 해야함)

2) μžλ™μœΌλ‘œ νƒ€μž…μ΄ λ³€ν™˜λ˜λŠ”κ°€?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” νƒ€μž…μ„ λ³€ν™˜ν•˜λ € λ…Έλ ₯ν•œλ‹€.
예λ₯Ό λ“€μ–΄ 3 + [1] 의 경우, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” κ°œλ°œμžκ°€ +λ₯Ό μ‚¬μš©ν–ˆμœΌλ―€λ‘œ 개발자 두 값을 μ—°κ²°ν•˜κ³  μ‹Άμ–΄ ν•œλ‹€κ³  생각해 3을 λ¬Έμžμ—΄ "3"으둜, [1]을 λ¬Έμžμ—΄ "1"둜 암묡적인 λ³€ν™˜μ„ μ‹œν–‰ν•΄ 두 λ¬Έμžμ—΄μ„ λΆ™μ—¬ "31"μ΄λΌλŠ” κ²°κ³Όλ₯Ό λ„μΆœν•¨.

반면 νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μœ νš¨ν•˜μ§€ μ•Šμ€ μž‘μ—…μ„ λ°œκ²¬ν•˜λŠ” μ¦‰μ‹œ λΆˆν‰ν•œλ‹€.(μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€λŠ” 뜻) μ˜¬λ°”λ₯΄μ§€ μ•Šμ•„ λ³΄μ΄λŠ” 연산을 μˆ˜ν–‰ν•˜λ©΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λ°”λ‘œ κ·Έ 뢀뢄을 지저가며, μ˜λ„λ₯Ό λͺ…μ‹œν•΄μ•Ό νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ 지적을 λ¬΄μ‚¬νžˆ 톡과할 수 μžˆλ‹€. 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 그런 암묡적 λ³€ν™˜ λ•Œλ¬Έμ— 문제의 원인을 μΆ”μ ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ— νƒ€μž…μ„ λ³€ν™˜ν•  λ•ŒλŠ” λͺ…μ‹œμ μœΌλ‘œ ν•΄μ•Ό ν•œλ‹€.

3) μ–Έμ œ νƒ€μž…μ„ κ²€μ‚¬ν•˜λŠ”κ°€?

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 경우 주둜 개발자의 μ˜λ„μ— 맞게 λ³€ν™˜μ‹œν‚¬ 뿐 λŒ€λΆ€λΆ„μ˜ μƒν™©μ—μ„œ νƒ€μž…μ΄ 무엇인지 따지지 μ•ŠλŠ”λ‹€. 

반면 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ 경우 컴파일 νƒ€μž„μ— μ½”λ“œμ˜ νƒ€μž…μ„ ν™•μΈν•˜κΈ° λ•Œλ¬Έμ— μ •μ μœΌλ‘œ μ½”λ“œλ₯Ό 뢄석해 이런 μ—λŸ¬λ₯Ό κ²€μΆœν•˜μ—¬ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ°λ„ 전에 μ•Œλ €μ€€λ‹€. 

4) μ—λŸ¬λŠ” μ–Έμ œ κ²€μΆœλ˜λŠ”κ°€?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λŸ°νƒ€μž„μ— μ˜ˆμ™Έλ₯Ό λ˜μ§€κ±°λ‚˜ 암묡적인 ν˜•λ³€ν™˜μ„ μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•΄μ•Όλ§Œ μ–΄λ–€ λ¬Έμ œκ°€ μžˆμŒμ„ 확인할 수 μžˆλ‹€. (운 μ’‹μœΌλ©΄ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ‹€ν–‰ν•˜λ‹€κ°€ λ°œκ²¬ν•  μˆ˜λ„)

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ 경우 컴파일 νƒ€μž„μ— 문법 μ—λŸ¬μ™€ νƒ€μž… κ΄€λ ¨ μ—λŸ¬λ₯Ό λͺ¨λ‘ κ²€μΆœν•œλ‹€.

 

2.3 μ½”λ“œ νŽΈμ§‘κΈ° μ„€μ •

λ‚œ VSCodeλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— VSCodeλ₯Ό μ‚¬μš©ν•  κ±°λ‹€. μ΄μ™Έμ˜ μ½”λ“œ νŽΈμ§‘κΈ°λ‘œ μ•„ν†°(Atom), μ„œλΈŒλΌμž„ ν…μŠ€νŠΈ(Sublime Text) 등을 선택할 수 μžˆλ‹€. (λ³ΈμΈμ—κ²Œ νŽΈν•œ 걸둜 μ„ νƒν•˜λ©΄ 됨)

TSC μžμ²΄λ„ νƒ€μž…μŠ€νŠΈλ¦½νŠΈλ‘œ κ΅¬ν˜„λœ λͺ…λ Ήν–‰ λ„κ΅¬μ΄λ―€λ‘œ TSCλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ NodeJSκ°€ ν•„μš”ν•˜λ‹€. NodeJsλŠ” ν”„λ‘œμ νŠΈμ˜ μ˜μ‘΄μ„±μ΄λ‚˜ λΉŒλ“œλ₯Ό κ΄€λ¦¬ν•˜λŠ” νŒ¨ν‚€μ§€ κ΄€λ¦¬μž NPM을 ν¬ν•¨ν•œλ‹€. NPM을 μ΄μš©ν•΄ TSC와 TSLint(TypeScript Linter; νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ¦°ν„°)λ₯Ό μ„€μΉ˜ν•œλ‹€. 

터미널 창을 μ—΄μ–΄ μƒˆ 디렉터리λ₯Ό λ§Œλ“€κ³  κ·Έ μ•ˆμ— μƒˆ NPM ν”„λ‘œμ νŠΈλ₯Ό μ΄ˆκΈ°ν™”ν•΄λ³΄μž.

# μƒˆ 디렉터리 생성
mkdir chapter-2
cd chapter-2

# μƒˆ NPM ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™” (ν”„λ‘¬ν”„νŠΈμ˜ μ§€μ‹œμ— 따름, 질문 없이 μ‹œμž‘ν•˜κ³  μ‹ΆμœΌλ©΄ npm init -y)
npm init

# TSC, TSLint, NodeJS용 νƒ€μž… μ„ μ–Έ μ„€μΉ˜
npm install --save-dev typescript tslint @types/node

2.3.1 tsconfig.json

λͺ¨λ“  νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν”„λ‘œμ νŠΈλŠ” 루트 디렉터리에 tsconfig.jsonμ΄λΌλŠ” 파일이 μ‘΄μž¬ν•΄μ•Ό ν•œλ‹€. tsconfig.json νŒŒμΌμ€ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ ν”„λ‘œμ νŠΈμ—μ„œ μ–΄λ–€ νŒŒμΌμ„ μ»΄νŒŒμΌν•˜κ³ , μ–΄λ–€ μžλ°”μŠ€ν¬λ¦½νŠΈ λ²„μ „μœΌλ‘œ λ°©μΆœν•˜λŠ”μ§€ 등을 μ •μ˜ν•œλ‹€.

루트 디렉터리에 tsconfig.jsonμ΄λΌλŠ” νŒŒμΌμ„ λ§Œλ“€κ³ (터미널에 touch tsconfig.json μž…λ ₯ or VSCode μ—΄μ–΄μ„œ 파일 μ„ νƒν•΄μ„œ 제일 μƒμœ„ 폴더에 tsconfig.json 직접 λ§Œλ“€κΈ°) μ•„λž˜μ™€ 같은 λ‚΄μš©μ„ μž…λ ₯ν•œλ‹€.

{
	"compilerOptions":{
    	"lib": ["es2015"],
        "module": "commonjs",
        "outDir": "dist",
        "sourceMap": true,
        "strict": true,
        "target": "es2015"
	},
    "include": [
    	"src"
	]
}

μ˜ˆμ œμ—μ„œλŠ” tsconfig.json νŒŒμΌμ„ 직접 λ§Œλ“€μ—ˆμ§€λ§Œ λ‹€μŒλΆ€ν„°λŠ” ./node_modules/.bin/tsc --initλΌλŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ λ‚΄μž₯ λͺ…령을 μ΄μš©ν•΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν”„λ‘œμ νŠΈλ₯Ό μžλ™μœΌλ‘œ μ„€μ •ν•  수 있음.

tsconfig.json νŒŒμΌμ„ μ΄μš©ν•΄ κ°„νŽΈν•˜κ²Œ μ†ŒμŠ€ 버전 관리 μ‹œμŠ€ν…œμ— 섀정을 포함할 수 있고, λͺ…령행을 μ΄μš©ν•΄ TSC의 μ˜΅μ…˜ λŒ€λΆ€λΆ„μ„ μ œμ–΄ν•˜λŠ” 방법도 μžˆλ‹€. μ΄μš©ν•  수 μžˆλŠ” λͺ…λ Ήν–‰ μ˜΅μ…˜μ€ Run ./node_modules/.bin/tsc --helpλ₯Ό μ‹€ν–‰ν•΄ 확인할 수 μžˆλ‹€. 

2.3.2 tslint.json

보톡 ν”„λ‘œμ νŠΈλŠ” TSLint μ„€μ •(탭을 μ‚¬μš©ν• μ§€ 곡백을 μ‚¬μš©ν•  지 등을 κ²°μ •ν•˜λŠ” μ½”λ”© μŠ€νƒ€μΌ κ·œμ•½)을 μ •μ˜ν•˜λŠ” tslint.json νŒŒμΌλ„ ν¬ν•¨ν•œλ‹€. (선택 사항이긴 ν•œλ° λͺ¨λ“  νƒ€μž…μŠ€νŠΈλ¦½νŠΈ ν”„λ‘œμ νŠΈμ— TSLintλ₯Ό μ΄μš©ν•΄ μΌκ΄€λœ μ½”λ”© μŠ€νƒ€μΌμ„ μ‚¬μš©ν•˜λ„λ‘ κ°•λ ₯히 ꢌμž₯함)

λ‹€μŒμ€ κΈ°λ³Έκ°’μœΌλ‘œ μ±„μ›Œμ§„ tslint.json νŒŒμΌμ„ λ§Œλ“œλŠ” λͺ…령이닀.

./node_modules/.bin/tslint --init

그리고 λ§Œλ“€μ–΄μ§„ νŒŒμΌμ„ μžμ‹ μ˜ μ½”λ”© μŠ€νƒ€μΌμ— 맞게 νŽΈμ§‘ν•  수 μžˆλ‹€. μ•„λž˜λŠ” μ±…μ˜ μ €μžμ˜ tslint.json 파일 λ‚΄μš©μ΄λ‹€.

{
    "defaultSeverity": "error",
    "extends": [
        "tslint:recommended"
    ],
    "rules": {
    	"semicolon": false,
        "trailing-comma": false
    }
}

 

2.4 index.ts

tsconfig.json 파일과 tslint.json νŒŒμΌμ„ μ„€μ •ν–ˆμœΌλ©΄ index.ts νŒŒμΌμ„ μΆ”κ°€ν•΄λ³΄μž.

mkdir src
touch src/index.ts

μƒμ„±λœ index.ts νŒŒμΌμ— μ•„λž˜μ™€ 같은 νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μž…λ ₯ν•œλ‹€.

console.log("Hello TypeScrit!")

νƒ€μž„μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰ν•˜μž.

# TSC둜 νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일
./node_module/.bin/tsc
# NodeJs둜 μ½”λ“œ μ‹€ν–‰
node ./dist/index.js

 
μœ„μ˜ λ‹¨κ²Œλ₯Ό μ œλŒ€λ‘œ 따라 ν–ˆλ‹€λ©΄ μ½”λ“œλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ μ½˜μ†”μ— λ‹€μŒκ³Ό 같은 ν•œ μ€„μ˜ λ‘œκ·Έκ°€ 좜λ ₯λœλ‹€.
Hello TypeScript!