2. TypeScript

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

  • REPL

  • TypeScript

    • interface vs Type

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

    • Union Type vs Intersection Type

  • Optional Parameter

ํ˜„์‹ค์ ์œผ๋กœ TypeScript๋ฅผ ์“ฐ๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” vscode ์ž๋™์™„์„ฑ + ์‹ค์‹œ๊ฐ„ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ

์˜ค๋ž˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ d.ts ํŒŒ์ผ๋งŒ ๋”ฐ๋กœ ํŒจํ‚ค์ง€๋กœ ์ œ๊ณต๋œ๋‹ค.

ํƒ€์ž… ๋ณ„์นญ (type alias)

๋˜‘๊ฐ™์€ ํƒ€์ž…์„ ํ•œ ๋ฒˆ ์ด์ƒ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅด๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

ํƒ€์ž…์„ ์œ„ํ•œ ์ด๋ฆ„์ด๋‹ค.

type Point = {
  x: number;
  y: number;
};
 
// ์•ž์„œ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์™€ ๋™์ผํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค
function printCoord(pt: Point) {
  console.log("The coordinate's x value is " + pt.x);
  console.log("The coordinate's y value is " + pt.y);
}

๊ฐ์ฒด ํƒ€์ž…๋ฟ์ด ์•„๋‹Œ ๋ชจ๋“  ํƒ€์ž…์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

// ex)
type ID = number | string;

๋‹จ์ง€ ๋ณ„์นญ์œผ๋กœ, ๋™์ผ ํƒ€์ž…์— ๋Œ€ํ•ด ๊ฐ๊ธฐ ๊ตฌ๋ณ„๋˜๋Š” '์—ฌ๋Ÿฌ ๋ฒ„์ „'์„ ๋งŒ๋“œ๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค.

๋ณ„๋„๋กœ ์ด๋ฆ„ ๋ถ™์ธ ํƒ€์ž…์„ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ.

type UserInputSanitizedString = string;
 
function sanitizeInput(str: string): UserInputSanitizedString {
  return sanitize(str);
}
 
// ๋ณด์•ˆ ์ฒ˜๋ฆฌ๋ฅผ ๋งˆ์นœ ์ž…๋ ฅ์„ ์ƒ์„ฑ
let userInput = sanitizeInput(getInput());
 
// ๋ฌผ๋ก  ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ๋Œ€์ž…ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค
userInput = "new input";

interface

๊ฐ์ฒด ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•.

interface Point {
  x: number;
  y: number;
}
 
function printCoord(pt: Point) {
  console.log("The coordinate's x value is " + pt.x);
  console.log("The coordinate's y value is " + pt.y);
}

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

๋น„์Šท ํ•˜์ง€๋งŒ ๋šœ๋ ทํ•œ ์ฐจ์ด๋Š”,

ํƒ€์ž…์€ ์ƒˆ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ๊ฐœ๋ฐฉ๋  ์ˆ˜ ์—†๊ณ ,

์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

interface Animal {
  name: string
}

interface Bear extends Animal {
  honey: boolean
}

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

type๋„ Bear ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ

ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” extends์˜ ๊ฐœ๋…์ด ์•„๋‹ˆ๊ณ  ๊ต์ง‘ํ•ฉ์„ ์ด์šฉํ•œ ๋ฐฉ์‹์ด๋ผ์„œ

ํ™•์žฅ ํ˜น์€ ๊ฐœ๋ฐฉ์ด ๋  ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ํ‘œํ˜„ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

type Animal = {
  name: string
}

type Bear = Animal & {
  honey: Boolean
}

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

๊ธฐ์กด์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ


interface Window {
  title: string
}

interface Window {
  ts: TypeScriptAPI
}

const src = 'const a = "Hello World"';
window.ts.transpileModule(src, {});

ํƒ€์ž…์€ ์ƒ์„ฑ๋œ ๋’ค์—๋Š” ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์—†๋‹ค

type Window = {
  title: string
}

type Window = {
  ts: TypeScriptAPI
}

 // Error: Duplicate identifier 'Window'.

์–ธ์ œ ์–ด๋–ค๊ฑธ ์จ์•ผํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ์šฐ์„  interface ์“ฐ๊ณ  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ type ์“ฐ๋ผํ•จ.

์ •ํ•ด์ง„ ๊ฐ’์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฐ ํƒ€์ž…์€ Union์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ธ๋‹ค.

 let category: 'food';

category = 'food';

๋ฐฐ์—ด๋ณด๋‹ค ๊น๊นํ•œ Tuple ํƒ€์ž…์ด ์žˆ๋‹ค.

let anythings: any[];

anythings = ['hp', 256];

let pair: [string, number];

pair = ['hp', 256];

Union Type

์—ฌ๋Ÿฌ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜.

type bool = true | false;

let flag: bool;

flag = true;

flag = false;

flag = 3; // ์—๋Ÿฌ๋‚จ

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

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

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

๊ธฐ๋ณธ๊ฐ’์„ ์žก์•„์ค„ ์ˆ˜ ์žˆ๋‹ค.

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 ๋“ฑ์œผ๋กœ ๋”ฐ๋กœ ์žก์•„์ฃผ๋ฉด ๋œ๋‹ค.

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


//

// ๋” ๊น”๋”
type Human = {
  name: string;
  age?: number;
};

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

greeting()

greeting({ name: 'ํ™๊ธธ๋™' })

greeting({ name: 'ํ™๊ธธ๋™', age: 13 })

Intersection Type

  • ๊ต์ง‘ํ•ฉ

type Combined = { a: number } & { b: string };
type Conflicting = { a: number } & { a: string };

Combined ์€ ๋งˆ์น˜ ํ•˜๋‚˜์˜ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์œผ๋กœ ์ž‘์„ฑ๋œ ๊ฒƒ ์ฒ˜๋Ÿผ a ์™€ b ๋‘ ๊ฐœ์˜ ์†์„ฑ์„ ๊ฐ€์ง.

๊ต์ง‘ํ•ฉ๊ณผ ์œ ๋‹ˆ์–ธ์€ ์žฌ๊ท€์ ์ธ ์ผ€์ด์Šค์—์„œ ์ถฉ๋Œ์„ ์ผ์œผ์ผœ์„œ Conflicting์„ ์ผ์œผํ‚ด.
  • Intersection Types

interfaces๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์œ ํ˜•์„ ํ™•์žฅํ•˜์—ฌ ์ƒˆ ์œ ํ˜•์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

interface Colorful {
  color: string;
}
interface Circle {
  radius: number;
}
 
type ColorfulCircle = Colorful & Circle;

function draw(circle: Colorful & Circle) {
  console.log(`Color was ${circle.color}`);
  console.log(`Radius was ${circle.radius}`);
}
 
// okay
draw({ color: "blue", radius: 42 });
 
// oops
draw({ color: "red", raidus: 42 }); // ์˜คํƒ€ ใ…‹ใ…‹

Generics

์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ.

ํ˜„์žฌ์˜ ๋ฐ์ดํ„ฐ์™€ ๋ฏธ๋ž˜์˜ ๋ฐ์ดํ„ฐ ๋ชจ๋‘๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.

๋‹จ์ผ ํƒ€์ž…์ด ์•„๋‹Œ ๋‹ค์–‘ํ•œ ํƒ€์ž…์—์„œ ์ž‘๋™ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.


identity ํ•จ์ˆ˜๋Š” ์ธ์ˆ˜๋กœ ๋ฌด์—‡์ด ์˜ค๋˜ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜.

์ œ๋„ค๋ฆญ์ด ์—†๋‹ค๋ฉด ํ•จ์ˆ˜์— ํŠน์ • ํƒ€์ž…์„ ์ค˜์•ผํ•œ๋‹ค.

function identity(arg: number): number {
  return arg;
}

//or
function identity(arg: any): any {
  return arg;
}

any๋Š” ์–ด๋–ค ํƒ€์ž…์ด๋“  ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์˜ ํƒ€์ž…์„ ์žƒ๋Š”๋‹ค.

number๊ฐ’์„ ๋„˜๊ฒจ๋„ any ํƒ€์ž…์ด ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ์˜๋ฏธ.

์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ˆ˜์˜ ํƒ€์ž…์„ ์บก์ฒ˜ํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ’์ด ์•„๋‹Œ ํƒ€์ž…์— ์ ์šฉ๋˜๋Š” ํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

function identity<Type>(arg: Type): Type {
  return arg;
}

Type๋ผ๋Š” ํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

Type์€ ์œ ์ €๊ฐ€ ์ค€ ์ธ์ˆ˜์˜ ํƒ€์ž…์„ ์บก์ฒ˜ํ•˜๊ณ  ์ด ์ •๋ณด๋ฅผ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ๋‹ค์‹œ ์‚ฌ์šฉ.

์ด ๋ฒ„์ „์˜ identity ํ•จ์ˆ˜๋Š” ํƒ€์ž…์„ ๋ถˆ๋ฌธํ•˜๊ณ  ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ œ๋„ค๋ฆญ์ด๋ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

any๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ธ์ˆ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์— number๋ฅผ ์‚ฌ์šฉํ•œ ์ฒซ ๋ฒˆ์งธ identity ํ•จ์ˆ˜๋งŒํผ ์ •ํ™•.

(์ฆ‰, ์–ด๋–ค ์ •๋ณด๋„ ์žƒ์ง€ ์•Š๋Š”๋‹ค)

๋” ์ข‹์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ ๋งŒ๋“œ๋Š” 11๊ฐ€์ง€ ํŒ

Last updated