λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
개발/Javascript

TypeScript

by 1mj 2022. 4. 28.

TypeScript λž€?

Javascript λ₯Ό 기반으둜 ν•˜μ—¬ 정적 νƒ€μž… 문법을 μΆ”κ°€ν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄

  • JavaScript 의 μƒμœ„ μ§‘ν•©μœΌλ‘œ Microsoft μ—μ„œ κ°œλ°œν–ˆλ‹€.
  • λ”°λΌμ„œ JavaScript의 λͺ¨λ“  κΈ°λŠ₯을 TypeScript μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.
  • ES6 μ‹ κ·œ 문법을 ν¬ν•¨ν•˜κ³  클래슀, μΈν„°νŽ˜μ΄μŠ€, 상속, λͺ¨λ“ˆ λ“±μ˜ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄μ„ μ œκ³΅ν•œλ‹€.
  • TypeScript 컴파일러λ₯Ό μ‚¬μš©ν•˜μ—¬ TypeScript(.ts) νŒŒμΌμ„ Javascript(.js) 파일둜 λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€.

 

TypeScript vs. JavaScript

🧐 속도, μ•ˆμ •μ„±

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 동적 νƒ€μž… μ–Έμ–΄λ‘œ λŸ°νƒ€μž„ μ†λ„λŠ” λΉ λ₯΄μ§€λ§Œ, νƒ€μž… μ•ˆμ •μ„±μ€ 보μž₯λ˜μ§€ μ•ŠλŠ”λ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 정적 νƒ€μž… μ–Έμ–΄λ‘œ 컴파일 μ‹œκ°„μ΄ κΈΈμ§€λ§Œ, μ•ˆμ •μ„±μ΄ 보μž₯λœλ‹€.

 

🧐 μ‹€ν–‰λ˜λŠ” μœ„μΉ˜

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ‹€ν–‰λœλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ λ‹¨μ—μ„œ μ‹€ν–‰λœλ‹€.

 

🧐 μ†ŒμŠ€ λ²ˆμ—­ 방식

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 인터프리터 언어이닀.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 컴파일 언어이닀.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λ‹€λ₯Έ 컴파일 μ–Έμ–΄λž‘μ€ 방식에 차이가 μžˆμ–΄ 트랜슀파일 언어라고 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€.

 

🧐 컴파일러 ν•„μš” μ—¬λΆ€

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ›Ή λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰λ˜λ©° λ³„λ„μ˜ μ»΄νŒŒμΌλŸ¬κ°€ ν•„μš”ν•˜μ§€ μ•Šλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 파일둜 λ³€ν™˜λ˜μ–΄ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ»΄νŒŒμΌν•˜λŠ” μ»΄νŒŒμΌλŸ¬κ°€ ν•„μš”ν•˜λ‹€.

 

🧐 νŒ¨ν„΄

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반의 언어이닀.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° 언어이며 클래슀, 상속, μΈν„°νŽ˜μ΄μŠ€ 및 μˆ˜μ •μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν΄λž˜μŠ€μ™€ 같은 κΈ°λŠ₯을 ν™œμš©ν•˜λ €λ©΄ ν•¨μˆ˜μ™€ ν”„λ‘œν† νƒ€μž…μ„ μ‚¬μš©ν•΄ 직접 μž‘μ„±ν•΄μ£Όμ–΄μ•Ό ν•˜μ§€λ§Œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 자체적으둜 μ§€μ›ν•˜κ³  μžˆλ‹€.
βœ… ν”„λ‘œν† νƒ€μž…(prototype)
μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž…μ΄λΌλŠ” 객체λ₯Ό 가지고 μžˆμ–΄ ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό 상속 λ°›λŠ”λ‹€. 객체 μ•ˆμ—λŠ” __proto__ 속성이 있고 μ΄λŠ” μžμ‹ μ˜ μ›ν˜• ν”„λ‘œν† νƒ€μž… 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” μˆ¨κ²¨μ§„ 링크이닀.

 

🧐 독립적? 의쑴적?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 컴파일된 ν›„ μ‹€ν–‰ν•˜λ―€λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈμ— μ˜μ‘΄μ μ΄λ‹€.

 

TypeScript νŠΉμ§•

  • νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•΄ λ³€μˆ˜μ— νƒ€μž…μ„ μ„ μ–Έν•˜μ—¬ μ•ˆμ •μ„±μ„ ν™•λ³΄ν•œλ‹€.
  • ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ§€μ›ν•˜μ—¬ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° ν™˜κ²½μ„ μ œκ³΅ν•œλ‹€.
  • 컴파일 κ³Όμ •μ—μ„œ ES6 이상 문법듀을 ES5(or ES3)둜 λ°”κΏ”μ£Όμ–΄ ν¬λ‘œμŠ€λΈŒλΌμš°μ§• 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.
βœ… Babel
νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ES6 κΈ°λŠ₯듀을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ Babelκ³Ό 같은 λ³„λ„μ˜ 트랜슀파일러λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. λΈŒλΌμš°μ €κ°€ μ΅œμ‹  λ²„μ „μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 문법을 μ΄ν•΄ν•˜μ§€ λͺ»ν•  λ•Œ λΈŒλΌμš°μ €κ°€ 이해할 수 μžˆλŠ” λ¬Έλ²•μœΌλ‘œ λ³€ν™˜μ‹œμΌœμ£ΌλŠ” νŠΈλžœμŠ€νŒŒμΌλŸ¬μ΄λ‹€.

 

TypeScript νƒ€μž… 지정

λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ νƒ€μž…μ„ μ§€μ •ν•˜μ—¬ 컴파일 μ‹œμ μ—μ„œ 잘λͺ»λœ μ½”λ“œλ₯Ό μž‘μ•„λ‚Ό 수 μžˆλ‹€.

  • 일반 λ³€μˆ˜, 맀개 λ³€μˆ˜, 객체 속성 등에 νƒ€μž…μ„ 지정할 수 μžˆλ‹€.
  • νƒ€μž…μ„ λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ λͺ¨λ“  νƒ€μž…μ΄ ν—ˆμš©λœλ‹€.
  • νƒ€μž…μ€ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•œλ‹€.
  • νƒ€μž…μ€ λ³€μˆ˜ : νƒ€μž…κ³Ό 같은 ν˜•νƒœλ‘œ μ§€μ •ν•œλ‹€.

 

λ³€μˆ˜

- 숫자(number)

let num: number = 5;

 

- λ¬Έμžμ—΄(string)

let str: string = 'hello';

 

- μ°Έ/거짓(boolean)

let isSomething: boolean = true;

 

- λ°°μ—΄([], Array)

let arr1: number[] = [1, 2, 3];
let arr2: Array<number> = [4, 5, 6];

 

- 객체({}, object)

let obj1: object = {name: 'anna', age: 15};
let obj2: {name: 'tom', age: 22};

 

- any : κΈ°μ‘΄ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ‚¬μš©ν•˜λ˜ κ²ƒκ³Ό μœ μ‚¬ν•˜κ²Œ μ•„무 νƒ€μž…μ΄λ‚˜ λ°›μŒ

let anyNumber: any = 10;
let anyString: any = 'hello';

console.log(anyNumber.length);  // undefined
console.log(anyString.length);  // 5

 

- unknown : any νƒ€μž…κ³Ό λ™μΌν•˜κ²Œ λͺ¨λ“  κ°’을 ν—ˆμš©ν•˜μ§€λ§Œ ν• λ‹Ήλœ κ°’이 μ–΄λ–€ νƒ€μž…인지 λͺ¨λ¦„(이후 μ—°μ‚° λΆˆκ°€)

let unknownNumber: unknown = 10;
let unknownString: unknown = 'hello';

console.log(unknownNumber.length);  // Object is of type 'unknown'
console.log(unknownString.length);  // Object is of type 'unknown'

if (typeof unknownString === 'string') {
  console.log(unknownString.length);  // νƒ€μž… 체크 ν•„μˆ˜
}
 

ν•¨μˆ˜

- μΈμžμ™€ λ°˜ν™˜ κ°’

μ˜ˆμ‹œμ—μ„œλŠ” string νƒ€μž… nameκ³Ό number νƒ€μž… age 인자, number νƒ€μž… λ°˜ν™˜ν•œλ‹€.

function myFunc(name: string, age: number) : number {
  // ...
}

 

- μ˜΅μ…˜ 인자

μƒλž΅ν•  수 μžˆλŠ” 인자 뒀에 λ¬ΌμŒν‘œλ₯Ό λΆ™μ—¬ μ˜΅μ…˜ 인자둜 μ§€μ •ν•œλ‹€.

function myFunc(name: string, age?: number) : number {
  // age 인자 μƒλž΅ κ°€λŠ₯
}

 

- never

μ ˆλŒ€ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ°’μ˜ νƒ€μž…, μ—λŸ¬λ‚˜ λ¬΄ν•œλ£¨ν”„μ—μ„œ μ‚¬μš©ν•œλ‹€.

function myFunc(): never {
  throw new Error('error!!!');
}

 

- void

μ–΄λ–€ 값을 가지지 μ•ŠλŠ” νƒ€μž…μ΄λ‹€.

function myFunc(): void {
  console.log('아무 것도 λ°˜ν™˜ν•˜μ§€ μ•ŠμŒ');
}

λŒ“κΈ€