2. TypeScript

1. REPL

REPL(read-eval-print loop) CLI, ์ฝ˜์†” ํ™˜๊ฒฝ, ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํ†ฑ๋ ˆ๋ฒจ(interactive toplevel), ๋žญ๊ธฐ์ง€ ์…ธ(language shell) ๋“ฑ์œผ๋กœ๋„ ๋ถˆ๋ฆผ ๋‹จ์ผ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ด๋ฅผ ํ‰๊ฐ€(์‹คํ–‰)ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ

ts-node

npm ts-node

ts-node๋Š” TypeScript ์‹คํ–‰๊ธฐ์ด๋ฉด์„œ Node.js์šฉ REPL ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ปดํŒŒ์ผ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜์ด ํ•„์š” ๐Ÿ’ก ts-node๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์—†์ด๋„ Node.js์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ ๐Ÿ’ก ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Œ

// REPL ์‹คํ–‰
npx ts-node


// ์ข…๋ฃŒ
Ctrl + C or .exit
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์ด์šฉํ•  ๊ฒƒ

    • npm install -D typescript

    • npm install -D ts-node

2. TypeScript

typescrip ๊ณต์‹๋ฌธ์„œ

JS + TS ๋ฌธ๋ฒ• (syntax) ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ํƒ€์ž…๋ฌธ๋ฒ•์„ ์ถ”๊ฐ€ํ•ด์„œ ๋งŒ๋“  ์Šˆํผ์…‹์œผ๋กœ, ํƒ€์ž… ๊ฐœ๋…์„ js์— ๋„์ž…ํ•œ ๊ฒƒ ์ •์  ํƒ€์ž…์˜ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ๋จ ๐Ÿ’ก ์ปดํŒŒ์ผ์ด๋ž€, ๋ฒˆ์—ญ์˜ ๊ฐœ๋…

Interface vs Type

ํƒ€์ž… ๋ณ„์นญ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์ 

๊ฑฐ์˜ ๋น„์Šทํ•˜๊ณ , ๋Œ€์ฒด๋กœ ์„ ํ˜ธ์— ๋”ฐ๋ผ ์„ ํƒ ํƒ€์ž… ํ™•์žฅ ๋ฐฉ๋ฒ• ๋“ฑ์—์„œ ์ฐจ์ด๊ฐ€ ์กด์žฌ (์ธํ„ฐํŽ˜์ด์Šค - ํ™•์žฅ ๊ฐ€๋Šฅ, ํƒ€์ž… - ํ™•์žฅ ๋ถˆ๊ฐ€๋Šฅ)

Interface

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด์ฒ˜๋Ÿผ { } ๋กœ ์„ ์–ธ extends๋กœ ํ™•์žฅํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

interface Person {
    name: string;
    age: number;
};

Type

ํƒ€์ž…์„ ์žก์•„์ฃผ๋Š” ๊ฒƒ ํƒ€์ž…์€ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ = ์„ ์‚ฌ์šฉํ•ด ํ• ๋‹นํ•˜๋ฉฐ, ํ•„์š”ํ•œ ๊ฒƒ์„ ๋‹ค ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์žˆ์Œ

type Human = {
  name: string;
  age: number;
};

ํƒ€์ž… ์ถ”๋ก 

ํƒ€์ž… ์ถ”๋ก 

ํƒ€์ž…์„ ์ผ์ผ์ด ์žก์•„์ฃผ๊ธฐ ํž˜๋“ค ๋•Œ, ๋ชจ๋“  ํƒ€์ž…์„ ๋‹ค ์ ์–ด์ฃผ์ง€ ์•Š๋”๋ผ๋„ ์•Œ์•„์„œ ํƒ€์ž…์„ ์ถ”๋ก ํ•ด์คŒ

๐Ÿ’ก ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ VS Code ๋ชจ๋‘ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ ๊ฐœ๋ฐœ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ VS Code๋ผ๋Š” IDE๋ฅผ ์ง์ ‘ ๋งŒ๋“  ์ด์œ ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ „ํŒŒํ•˜๊ธฐ ์œ„ํ•จ VS Code๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์ผ๋ ‰ํŠธ๋ก ์œผ๋กœ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” IDE์™€ ํ†ตํ•ฉ๋˜์–ด ์ž๋™ ์™„์„ฑ์ด ์ง€์›๋˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์บ์น˜ํ•˜๊ธฐ ์‰ฌ์›€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ JS์™€ ๋†’์€ ํ˜ธํ™˜์„ฑ์„ ๊ฐ€์ง€๋Š” ์ด์œ ๋Š” ์œ ์ €๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ

๐Ÿ“… ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ : 2012๋…„ 10์›” 1์ผ ๐Ÿ“… VS Code : 2015๋…„ 4์›” 29์ผ

Union Type vs Intersection Type

Union Type

ํ•ฉ์ง‘ํ•ฉ ์—ฌ๋Ÿฌ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Œ์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•

type MyBool = true | false;

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•  ๋•Œ ์œ ์šฉ

type Category = 'food' | 'toy' | 'bag';

function fetchProducts({ category }: { category: Category }) {
  console.log(`Fetch ${category}`);
}

๋ ˆ๊ฑฐ์‹œ ํ™˜๊ฒฝ ๋˜๋Š” ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ

์›๋ž˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ํƒ€์ž…์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ ๋Œ€ํ‘œ์ ์œผ๋กœ ReactNode

export type ReactNode =
  | React$Element<any>
  | ReactPortal
  | ReactText
  | ReactFragment
  | ReactProvider<any>
  | ReactConsumer<any>;

Intersection Type

๊ต์ง‘ํ•ฉ ํƒ€์ž…์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•, ์—ฌ๋Ÿฌ ์†์„ฑ์„ ๊ฐ€์ง

type Human = {
  name: string;
  age: number;
};

type Creature = {
  hp: number;
  mp: number;
};

type Person = Human & Creature;

let person: Person;

person = { name: 'ํ™๊ธธ๋™', age: 13, hp: 256, mp: 16 };

Optional Parameter

Optional Parameter

ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์ง€ ์•Š์œผ๋ฉด undefined๊ฐ€ ๋‚˜์˜ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ๋„๋ก ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Optional Parameter๋ฅผ ์‚ฌ์šฉ ๋ฌผ์Œํ‘œ ๊ธฐํ˜ธ(?)

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

// Optional Parameter ์‚ฌ์šฉ 
function greeting(name?: string): string {
  return `Hello, ${name || 'world'}`;
}


// ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • 
function greeting(name: string = 'world'): string {
    return `Hello, ${name}`;
}

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์˜ค๋ธŒ์ ํŠธ์ผ ๋•Œ ๋งŽ์ด ํ™œ์šฉ

function greeting({ name, age }: {
  name: string;
  age?: number;  
}): string {
  return age ? `${name} (${age})` : name;
}
  • โš ๏ธ ts-node์—์„œ๋Š” ํ•œ ์ค„๋กœ ๋ถ™์—ฌ ์“ฐ๊ฑฐ๋‚˜, type ๋“ฑ์œผ๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ด์„ ๊ฐ€๋Šฅ

Last updated