πŸ‘¨β€πŸ’»

Typescript μ΄ν•΄ν•˜κΈ° 1편

2021-02-20   |   개발

post-img

κΉƒν—™ TIL λ ˆν¬μ— κΈ°λ‘ν–ˆλ˜ λ‚΄μš©μ„ μ •λ¦¬ν•˜μ—¬ λΈ”λ‘œκΉ…ν•©λ‹ˆλ‹€.

Hello Typescript

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” msκ°€ κ°œλ°œν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν™•μž₯ μ–Έμ–΄λ‹€. 동적 언어인 μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ λ‹€λ₯΄κ²Œ μš”μ†Œλ“€μ— νƒ€μž…μ„ μ •μ˜ν•΄μ£ΌλŠ” 정적 μ–Έμ–΄λ‹€. μ§€κΈˆκΉŒμ§€ μ•Œκ³  있던 λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 문법적 μš”μ†Œλ₯Ό μ΄μš©ν•  수 μžˆλŠ”κ±΄ 물둠이고, μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 컴파일 λ˜λŠ” ν™˜κ²½μ—μ„œ λ³€μˆ˜ 및 기타 μš”μ†Œλ“€μ˜ νƒ€μž…μ΄ κ²°μ •λœλ‹€. λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œ νƒ€μž…μ΄ νŒŒμ•…λ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ κ°€μž₯ μ°¨λ³„λ˜λŠ” 뢀뢄이닀.

컴파일 λ‹¨κ³„μ—μ„œ κ³„λ°œμžμ˜ 였λ₯˜λ₯Ό κ°μ§€ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž¨μ˜ μ—λŸ¬λ₯Ό 미리 방지할 수 μžˆλ‹€. λ”κ΅°λ‹€λ‚˜ VSCodeλŠ” MSμ—μ„œ κ°œλ°œν•œ μ½”λ“œ 에디터이기 λ•Œλ¬Έμ— 기본적으둜 νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό λ‚΄μž₯ν•˜κ³  μžˆλ‹€. κ·Έλž˜μ„œ μ—λŸ¬ 탐지가 VSCodeμ—μ„œ λ”μš± νŽΈν•˜λ‹€. λ‚˜λ„ VSCodeμ—μ„œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ κ°œλ°œν•˜κ³  μžˆλŠ”λ°, 에디터가 λ˜‘λ˜‘ν•΄μ‘Œλ‹€λŠ” λŠλ‚Œμ„ λ°›λŠ”λ‹€.

νƒ€μž…μ΄ μ •μ˜λœ ν΄λž˜μŠ€λ‚˜ 객체 λ‚΄λΆ€μ˜ λ©”μ„œλ“œλ₯Ό μžλ™μœΌλ‘œ 미리 λ³Ό 수 μžˆλ‹€. λͺ¨λ“ˆλ‘œ λΆˆλŸ¬μ™€μ§„ ν•¨μˆ˜μ˜ μ ˆλŒ€ 경둜λ₯Ό λ°”λ‘œ νŒŒμ•…ν•΄μ„œ ν•΄λ‹Ή 파일둜 λ°”λ‘œ μ°Ύμ•„κ°ˆ 수 있게 ν•΄μ€€λ‹€. (mac ν™˜κ²½μ—μ„œλŠ” cmd + 클릭) tabν‚€λ₯Ό ν†΅ν•΄μ„œ λͺ¨λ“  문자λ₯Ό λ‹€ μΉ˜μ§€ μ•Šκ³  apiλ₯Ό μ •ν™•ν•˜κ²Œ 완성해주기도 ν•˜κ³ , import λ˜μ§€ λͺ»ν•œ λͺ¨λ“ˆμ„ μžλ™μœΌλ‘œ 뢈러올 수 μžˆλ‹€.

function hello(name: string, age: number): string { return `hello, my name is ${name} and ${age} years old.`; } hello('kang', '28'); // Error: '28'은 number에 ν• λ‹Ή 될 수 μ—†μŠ΅λ‹ˆλ‹€.



νƒ€μž…μŠ€ν¬λ¦½νŠΈ κΈ°λ³Έ νƒ€μž…

String, Number, Boolean νƒ€μž…

정말 κ°„λ‹¨ν•˜κ²Œ λ³€μˆ˜μ˜ 였λ₯Έμͺ½μ— νƒ€μž…μ„ 적어주면 λœλ‹€. let ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•˜κ³  ν• λ‹Ήν•œ λ³€μˆ˜λŠ” ꡳ이 μ΄λ ‡κ²Œ νƒ€μž…μ„ κΌ­ 적어주지 μ•Šμ•„λ„ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ μžλ™μœΌλ‘œ νƒ€μž…μ„ μΆ”λ‘ ν•œλ‹€. const λ³€μˆ˜λŠ” 쑰금 μ˜ˆμ™Έκ°€ μžˆλ‹€.

// String let str: string = 'hankyeol'; // Number let num: number = 28; // Boolean let bool: boolean = true;

Array, Tuple, Enum νƒ€μž…

배열은 μ΅μˆ™ν•œλ°, νŠœν”Œ, μ΄λ„˜(Enum)은 μžλ°”μŠ€ν¬λ¦½νŠΈ κ°œλ°œμžμ—κ²Œ 쑰금 μƒμ†Œν•  수 μžˆλ‹€. λ‚˜λ„ κ·Έλž¬λ‹€.

  • νŠœν”Œμ€ λ°°μ—΄ν˜•μ—μ„œ 길이가 κ³ μ •λ˜κ³ , μš”μ†Œλ§ˆλ‹€ νƒ€μž…μ΄ μ§€μ •λ˜μ–΄ μžˆλŠ” νƒ€μž…μ„ λ§ν•œλ‹€.
  • μ΄λ„˜(Enum)은 νŠΉμ •ν•œ κ°’, μƒμˆ˜λ“€μ˜ 집합을 λ‚˜νƒ€λ‚΄λŠ” νƒ€μž…μ΄λ‹€. κ°œλ°œμžκ°€ μš”μ†Œλ“€μ˜ 인덱슀λ₯Ό 지정해 쀄 수 μžˆλ‹€λŠ” νŠΉμ§•μ„ 가진닀.
// Array νƒ€μž…μ€ μ•„λž˜ 2가지 방법 λ‹€ μ‚¬μš©ν•  수 μžˆλ‹€. let arr: number[] = [1, 2, 3]; let arr: Array<number> = [1, 2, 3]; // μ œλ„€λ¦­ 문법 // Tuple let arr: [string, number] = ['hankyeol', 28]; arr[3]; // -> Error: 3번 μΈλ±μŠ€λŠ” μ—†μŠ΅λ‹ˆλ‹€. // Enum enum Hankyeol { DEVELOPER = 4, KOREAN, HUMAN } let language: Hankyeol = Hankyeol[5]; // KOREAN

Any, Void, Never νƒ€μž…

  • any νƒ€μž…μ€ 단어 뜻 κ·ΈλŒ€λ‘œ λͺ¨λ“  νƒ€μž…μœΌλ‘œ 좔둠될 수 μžˆλŠ” νƒ€μž…μ΄λ‹€. λ§ˆλ²• μ£Όλ¬Έκ³Ό 같은 νƒ€μž…μ΄μ§€λ§Œ λͺ…ν™•ν•œ νƒ€μž…μ„ μ •ν•΄μ£ΌκΈ° 전에 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.
  • voidλŠ” 값을 μ„€μ •ν•  수 μ—†λŠ” νƒ€μž…μ΄λ‹€. λ³€μˆ˜μ—λŠ” undefined, null κ°’λ§Œ μ„€μ •ν•  수 있고, ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ μ •μ˜λ˜μ–΄ 리턴 값이 μ—†λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • never νƒ€μž…μ€ ν•¨μˆ˜ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ μ •μ˜λ˜κ³ , 이 ν•¨μˆ˜μ˜ 끝에 μ ˆλŒ€ λ„λ‹¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 의미λ₯Ό 가진닀. μœ λ‹ˆμ˜¨ νƒ€μž…κ³Ό 병행할 μ‹œμ—λŠ” never νƒ€μž…μ„ μ†Œκ±° λͺ©μ μœΌλ‘œ μ‚¬μš©ν•œλ‹€.
// any function login(id: any, password: any): boolean { return true; } // void function login(id: string, password: string): void { console.log(id, password); } // never function login(id: string, password: string): never { while (true) {} }



νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜ νƒ€μž…

ν•¨μˆ˜μ˜ μΈμžμ™€ λ°˜ν™˜κ°’μ— νƒ€μž…μ„

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•ŒλŠ” κ°œλ³„ 인자(νŒŒλΌλ―Έν„°)와 ν•¨μˆ˜μ˜ 결과값에 ν•΄λ‹Ήν•˜λŠ” 리턴값에 νƒ€μž…μ„ μ •ν•΄μ€€λ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ˜ μΈμžμ— λŒ€ν•΄μ„œ νŠΉλ³„ν•œ μ²˜λ¦¬κ°€ μ—†λ‹€λ©΄ λͺ¨λ‘ ν•„μˆ˜ν•œ 인자둜 μΈμ‹ν•œλ‹€. 이 말은 ν•¨μˆ˜ μ²˜λ¦¬μ— λ°˜λ“œμ‹œ 듀어가지 μ•ŠλŠ” μ˜΅μ…”λ„ν•œ μΈμžλΌλ„ undefined, null κ°’ 처리λ₯Ό ν•΄μ•Ό ν•œλ‹€λŠ” 것이닀. 맀번 κ·Έλ ‡κ²Œ ν•΄μ£ΌλŠ” 것은 νž˜λ“œλ‹ˆκΉŒ ? 기호λ₯Ό μ‚¬μš©ν•΄μ„œ μ˜΅μ…”λ„ν•œ μΈμžλΌλŠ” 것을 μ•Œλ €μ€„ 수 μžˆλ‹€.

function login(id: stirng, password: string, nickname?: string): boolean { // nickname은 μ˜΅μ…”λ„ν•œ 인자둜 λ³Ό 수 μžˆλ‹€. if (id && password) { return true; } else { return false; } } // rest parameter도 μ΄λ ‡κ²Œ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€. function sum(num1: number, ...nums: number[]): number { return ... }

Typescriptμ—μ„œ this

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ μ •μ˜ν•œ ν•¨μˆ˜μ—μ„œ thisλŠ” 인자의 제일 μ•žμ—μ„œ κ·Έ νƒ€μž…μ„ μ •ν•  수 μžˆλ‹€. thisλΌλŠ” μ΄λ¦„μœΌλ‘œ μ •μ˜ν•˜λ©΄ λœλ‹€. ν•¨μˆ˜ 자체의 μΈμžλŠ” 2번째 μš”μ†ŒλΆ€ν„° μ‹œμž‘ν•˜λŠ” 것이닀.

function getParam(this: string, index: number): string { const params = this.split(','); if (index < 0 || params.length <= index) { return ''; } return this.split(',')[index]; }

ꡬ쑰뢄해 할당을 μ΄μš©ν•œ λ„€μž„λ“œ νŒŒλΌλ―Έν„°

ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ₯Ό κ΅¬μ‘°λΆ„ν•΄ν•˜μ—¬ 객체 ν˜•νƒœλ‘œ κ°μ‹ΈλŠ” μ‹μœΌλ‘œ νƒ€μž…μ„ ν• λ‹Ή ν•  수 μžˆλ‹€. 이 방법은 propsλ₯Ό ν•¨μˆ˜ 인자둜 많이 μ „λ‹¬ν•˜λŠ” React μ»΄ν¬λ„ŒνŠΈ μ½”λ“œμ— 자주 μ‚¬μš©λœλ‹€.

ν•¨μˆ˜μ— μΈμžκ°€ 쑰금 λ§Žμ•„μ§„λ‹€ μ‹ΆμœΌλ©΄ κ΅¬μ‘°λΆ„ν•΄μ˜ κ°œλ…μ„ 잘 μ΄μš©ν•œ λ„€μž„λ“œ νŒŒλΌλ―Έν„°λ₯Ό μ΄μš©ν•΄μ£Όλ©΄ μ’‹λ‹€. 또 우리의 VSCodeλŠ” ν•¨μˆ˜μ˜ μΈμžκ°€ λ„λΆ€λŸ¬μ§„ 것을 보고 λΉ λ₯΄κ²Œ λ„€μž„λ“œ νŒŒλΌλ―Έν„° ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” μΉ˜ν™˜ κΈ°λŠ₯도 가지고 μžˆλ‹€. VSCodeμ—μ„œ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜κ³  ν•¨μˆ˜ 이름에 μ»€μ„œλ₯Ό κ°€μ Έλ‹€ λŒ€λ©΄ μ˜΅μ…˜ 메뉴가 λœ¬λ‹€.

function getText({ name, age = 28, language }: { name: string; age: number; language?: string; }): string { const nameText = name.substr(0, 10); const ageText = age >= 35 ? 'seneir' : 'junior'; return `name: ${nameText}, age: ${ageTet}, language: ${language}`; } // μ‚¬μš©ν•  λ•Œμ—λ„ κ°μ²΄ν˜•νƒœλ‘œ getText({ name: 'hankyeolk', age: 26 });



κ°μ²΄ν˜• νƒ€μž… μƒμž μΈν„°νŽ˜μ΄μŠ€

μΈν„°νŽ˜μ΄μŠ€μ˜ 기본적인 κ·œμΉ™

μΈν„°νŽ˜μ΄μŠ€λŠ” νƒ€μž…μœΌλ‘œ μ •μ˜λœ 약속, κ·œμΉ™μ΄λΌκ³  λ³Ό 수 μžˆλ‹€. 즉, μΈν„°νŽ˜μ΄μŠ€λ‘œ λ‹€μ–‘ν•œ μš”μ†Œμ˜ νƒ€μž…μ„ μ •ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ νŽΈν•˜κ² λ‹€.

  • μΈν„°νŽ˜μ΄μŠ€λ‘œ νƒ€μž…μ€ interface ν‚€μ›Œλ“œμ— {} κ΄„ν˜Έλ‘œ λ¦¬ν„°λŸ΄ ν•˜λŠ” 것이닀. μΈν„°νŽ˜μ΄μŠ€μ—λŠ” μ˜΅μ…”λ„ν•œ μ†μ„±μ˜ νƒ€μž…μ„ 지정할 수 μžˆλ‹€.(? 기호) λ§ˆμ°¬κ°€μ§€λ‘œ ν•˜λ‚˜μ˜ 속성에 μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ„ 지정할 μˆ˜λ„ μžˆλ‹€.(or 쑰건과 κ°™λ‹€)
  • μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ μ •μ˜λœ 속성듀은 μˆœμ„œκ°€ μ—†λ‹€. μΈν„°νŽ˜μ΄μŠ€ νƒ€μž… 내뢀에 μ •μ˜λ˜μ§€ μ•Šμ€ 속성이 μžˆλ‹€λ©΄ 그것을 ν˜ΈμΆœν•˜κ±°λ‚˜ λ©”μ„œλ“œ ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•  λ•Œ, 값을 λ³€κ²½ν•  λ•Œ μ—λŸ¬ μ½”λ“œλ₯Ό 보게 λœλ‹€.
interface Person { name: string; age?: number; birthday: number | string; }

μΈν„°νŽ˜μ΄μŠ€ 읽기 μ „μš© 속성과 인덱슀 νƒ€μž…

  • μΈν„°νŽ˜μ΄μŠ€ νƒ€μž… λ‚΄λΆ€μ˜ 속성은 읽기 μ „μš© 속성을 κ°€μ§ˆ 수 μžˆλ‹€. (readonly) 읽기 μ „μš©μœΌλ‘œ ν• λ‹Ήλœ 속성은 κ°’μ˜ μž¬ν• λ‹Ήμ΄ λΆˆκ°€ν•˜λ‹€. μ„ μ–Έ μ‹œμ μ—λ§Œ 값을 ν• λ‹Ήν•  수 μžˆλ‹€.
  • 속성에 λŒ€ν•œ 이름을 μ •μ˜ν•˜μ§€ μ•Šκ³ , κ°’μ˜ νƒ€μž…λ§Œ μ •ν•˜λŠ” 인덱슀 νƒ€μž… 속성이 μžˆλ‹€. [key: νƒ€μž…]: νƒ€μž… ν˜•νƒœλ‘œ μΈν„°νŽ˜μ΄μŠ€ 내뢀에 μ •λ¦¬λœλ‹€. keyλΌκ³ ν•˜λŠ” μ΄λ¦„μ—λŠ” 아무 λ¬Έμžλ‚˜ 와도 λœλ‹€. 속성 이름에 λŒ€ν•œ νƒ€μž…μ„ κ²€μ¦ν•΄μ„œ κ·Έ λ•Œμ˜ νƒ€μž…μ΄ μ—°κ²°λœ νƒ€μž…κ³Ό μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€ 속성 μ΄λ¦„μ—λŠ” 'λ¬Έμžμ—΄', '숫자'κ°€ 올 수 μžˆλ‹€. 숫자둜 온 이름은 λ‚΄λΆ€μ μœΌλ‘œ λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ˜μ–΄μ„œ μ‚¬μš©λœλ‹€.
interface Book { readonly name: string; [key: string]: number | string; } const Onepiece: Book = { name: 'dawn', price: 4500 // index type에 μ˜ν•΄μ„œ 반영이 될 수 μžˆλ‹€. }; Onepiece.name = 'moon'; // Error : 읽기 μ „μš© 속성은 값이 μž¬ν• λ‹Ή 될 수 μ—†λ‹€.

μΈν„°νŽ˜μ΄μŠ€λ‘œ ν•¨μˆ˜ μ •μ˜ν•˜κΈ°

μΈν„°νŽ˜μ΄μŠ€λ‘œ ν•¨μˆ˜ 자체의 νƒ€μž…μ„ μ •μ˜ν•  수 μžˆλ‹€. κ°œλ³„ νŒŒλΌλ―Έν„°μ— λŒ€ν•œ μ •μ˜λΆ€ν„° λ°˜ν™˜κ°’κΉŒμ§€ μ •μ˜ κ°€λŠ₯ν•˜λ‹€. μΈν„°νŽ˜μ΄μŠ€λ‘œ ν•¨μˆ˜μ˜ νƒ€μž…μ„ μ •μ˜ν•  λ•Œ, ν•¨μˆ˜ λ‚΄λΆ€/μ™ΈλΆ€μ—μ„œ μ‚¬μš©λ  ν•¨μˆ˜ 속성값도 μ •μ˜ν•  수 μžˆλ‹€.

interface GetText { (name: string, age: number): string; totalCall?: number; } const getText: GetText = (name, age) => { if (getText.totalCall !== undefined) { getText.totalCall += 1; } return `totalcall : ${getText.totalCall}`; }; getText.totalCall = 0; getText('', 0); // -> totalcall : 1

μΈν„°νŽ˜μ΄μŠ€ ν™•μž₯

μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ 간에 extends ν‚€μ›Œλ“œλ‘œ ν™•μž₯이 κ°€λŠ₯ν•˜λ‹€. ν™•μž₯의 κ°œλ…μ— 맞게 속성 λ°›λŠ” μžμ‹μ€ λΆ€λͺ¨μ˜ λͺ¨λ“  속성을 κ°€μ§€κ²Œ λœλ‹€. (가지고 μžˆμ–΄μ•Ό ν•œλ‹€κ°€ λ§žλŠ” μ„€λͺ… κ°™λ‹€.) ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λŠ” μ—¬λŸ¬κ°œμ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„° ν™•μž₯ κ°€λŠ₯ν•˜λ‹€.

λ˜ν•œ & 기호λ₯Ό μ‚¬μš©ν•΄μ„œ μΈν„°νŽ˜μ΄μŠ€ 속성에 λŒ€ν•œ κ΅μ§‘ν•©κ²©μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. 쑰금 말이 μ–΄λ €μš΄λ°, & 기호λ₯Ό μ‚¬μš©ν•΄μ„œ μ„œλ‘œ λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€μ— μžˆλŠ” 속성을 λͺ¨λ‘ κ°€μ§€λŠ” μƒˆλ‘œμš΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ νŽΈν•  것 κ°™λ‹€. μ΄λ ‡κ²Œ 합쳐진 νƒ€μž…μ„ μΈν„°μ„Ήμ…˜ νƒ€μž…μ΄λΌκ³  ν•œλ‹€.

// interface extend interface Person { name: string; age: number; } interface Developer { favoriteLang: string; } interface Hankyeol extends Person, Developer { liveInSeoul: true; } // intersection type interface Post { name: string; postId: number; } type PP = Person & Post; // Person interface와 ν•©μ³€λ‹€. const pp: PP = { name: 'hankyeol', age: 28, postId: 19 };
λ‹€μŒνŽΈμ— 계속...

λͺ©μ°¨

μ΄μ–΄μ§€λŠ” κΈ€,