2. TypeScript

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • REPL

  • TypeScript

    • Interface vs Type

    • ํƒ€์ž… ์ถ”๋ก 

    • Union Type vs Intersection Type

    • Optional Parameter

REPL

REPL(์ฝ˜์†” ํ™˜๊ฒฝ)์„ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด ts-node๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

npx ts-node

ts-node๋Š” node_modules์— ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋”ฐ๋กœ ์„ค์น˜๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

ํƒ€์ž…์ŠคํŠธ๋ฆฝํŠธ์˜ ํƒ€์ž…

๊ธฐ๋ณธ์ ์ธ ํƒ€์ž…

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•  ๋•Œ๋Š” typeof ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ณค ํ–ˆ์—ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ string, number, boolean ๋“ฑ์ด ์žˆ๋‹ค.

๋ฐฐ์—ด

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฐฐ์—ด์˜ ํƒ€์ž…์€ ์–ด๋–ป๊ฒŒ ์ง€์ •ํ• ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด [1, 2, 3]๊ณผ ๊ฐ™์ด ์ˆซ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์ด๋ฉด number[] ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

any ํƒ€์ž…

ํƒ€์ž… ๊ฒ€์‚ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์•„๋ฌด ํƒ€์ž…์ด๋‚˜ ๋‹ค ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

ํƒ€์ž… ์ง€์ •

๋ณ€์ˆ˜/๊ฐ์ฒด

let name: string;
let age: number;

name = "ํ™๊ธธ๋™";
age = "13";

let human: {
  name: string;
  age: number;
};

human = { name: "ํ™๊ธธ๋™", age: 13 };

์ผ๋ฐ˜ ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด ๋‚ด๋ถ€๊นŒ์ง€ type์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. type ๋ณ„์นญ์ด๋‚˜ interface๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์† ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฐฐ์—ด ํƒ€์ž… ์ง€์ •

let numbers: number[];

numbers = [1, 2, 3];

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์œ„์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ํƒ€์ž…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Tuple์„ ์“ด๋‹ค. ๋ฐฐ์—ด ๊ฐœ์ˆ˜์™€ ํƒ€์ž…๊นŒ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

let anythings: any[];
let anythings: ["hp", 256];

let pair: [string, number];
pair = ["hp", 256];

์ธํ„ฐํŽ˜์ด์Šค ํ™•์žฅํ•˜๊ธฐ

interface Animal {
  name: string;
}

interface Bear extends Animal {
  honey: boolean;
}

const bear = getBear();
bear.name;
bear.honey;

๊ต์ง‘ํ•ฉ์„ ํ†ตํ•˜์—ฌ ํƒ€์ž… ํ™•์žฅํ•˜๊ธฐ

type Animal = {
  name: string;
};

type Bear = Animal & {
  honey: Boolean;
};

const bear = getBear();
bear.name;
bear.honey;

ํ•จ์ˆ˜ ํƒ€์ž… ์ง€์ •

ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’๊ณผ ์ธ์ž์—๋„ ํƒ€์ž… ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

function getMutiply(x: number, y: number): number {
  return x * y;
}

์œ ๋‹ˆ์˜จ ํƒ€์ž…

let y: true | false;

y = true;
y = false;

์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ์ด์šฉํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋‘๊ฐœ ์ด์ƒ์˜ ํƒ€์ž…๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฃผ๋กœ ํ•จ์ˆ˜์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

type Category = "food" | "toy" | "bag";
let c: Category;

c = "toy";
c = "bread"; // error

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

fetchProducts({ category: "food" }); // Fetch food
fetchProducts({ category: "bread" }); // error

์˜ต์…”๋„ ์—ฐ์‚ฐ์ž

๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜์— ์ธ์ž ๊ฐ’์ด ์•ˆ๋“ค์–ด์˜ค๋ฉด undefined๋กœ ์„ค์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

function add(x: number, y?: number): number {
  return x + (y || 0);
}

์ธ์ž ๊ฐ’์ด ์•ˆ๋“ค์–ด์™”์„ ๋•Œ ๋Œ€์•ˆ์œผ๋กœ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ธ์ž์— ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

function add(x: number, y: number = 0): number {
  return x + y;
}

function greeting(name?: string): string {
  return `Hello, ${name || "world"}`;
}

Optional Parameter๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด์ผ ๋•Œ ์ž์ฃผ ํ™œ์šฉ๋œ๋‹ค. (๋‚˜์ด๊ฐ€ ์žˆ์„์ˆ˜๋„ ์žˆ๊ณ  ์—†์„์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ)

function greeting({ name, age }: { name: string; age?: number }): string {
  return age ? `${name} (${age})` : name;
}

์ฝ”๋“œ ์˜ˆ์‹œ

//App.tsx
export function App({ name }: { name?: string }) {
  return <p>Hello, {name || "world"}!</p>;
}
//main.tsx
import ReactDOM from "react-dom/client";
import { App } from "./App";

const element = document.getElementById("root");

if (element) {
  const root = ReactDOM.createRoot(element);

  root.render(<App name="minhye" />);
}

Last updated