Skip to content

Latest commit

Β 

History

History
100 lines (76 loc) Β· 3.43 KB

File metadata and controls

100 lines (76 loc) Β· 3.43 KB
title layout permalink oneline
Literal Types
docs
/docs/handbook/literal-types.html
Using literal types with TypeScript

λ¦¬ν„°λŸ΄ νƒ€μž…μ€ μ§‘ν•© νƒ€μž…μ˜ 보닀 ꡬ체적인 ν•˜μœ„ νƒ€μž…μž…λ‹ˆλ‹€. 이것이 μ˜λ―Έν•˜λŠ” λ°”λŠ” νƒ€μž… μ‹œμŠ€ν…œ μ•ˆμ—μ„œ "Hello World"λŠ” stringμ΄μ§€λ§Œ, string은 "Hello World"κ°€ μ•„λ‹ˆλž€ κ²ƒμž…λ‹ˆλ‹€.

μ˜€λŠ˜λ‚  TypeScriptμ—λŠ” λ¬Έμžμ—΄κ³Ό 숫자, 두 κ°€μ§€ λ¦¬ν„°λŸ΄ νƒ€μž…μ΄ μžˆλŠ”λ° 이λ₯Ό μ‚¬μš©ν•˜λ©΄ λ¬Έμžμ—΄μ΄λ‚˜ μˆ«μžμ— μ •ν™•ν•œ 값을 μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ¦¬ν„°λŸ΄ νƒ€μž… 쒁히기 (Literal Narrowing)

var λ˜λŠ” let으둜 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  경우 이 λ³€μˆ˜μ˜ 값이 변경될 κ°€λŠ₯성이 μžˆμŒμ„ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ¦½λ‹ˆλ‹€. 반면, const둜 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ²Œ 되면 TypeScriptμ—κ²Œ 이 κ°μ²΄λŠ” μ ˆλŒ€ λ³€κ²½λ˜μ§€ μ•ŠμŒμ„ μ•Œλ¦½λ‹ˆλ‹€.

// constλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜ helloWorldκ°€
// μ ˆλŒ€ λ³€κ²½λ˜μ§€ μ•ŠμŒμ„ 보μž₯ν•©λ‹ˆλ‹€.

// λ”°λΌμ„œ, TypeScriptλŠ” λ¬Έμžμ—΄μ΄ μ•„λ‹Œ "Hello World"둜 νƒ€μž…μ„ μ •ν•©λ‹ˆλ‹€.
const helloWorld = "Hello World";

// 반면, let은 변경될 수 μžˆμœΌλ―€λ‘œ μ»΄νŒŒμΌλŸ¬λŠ” λ¬Έμžμ—΄μ΄λΌκ³  μ„ μ–Έν•  κ²ƒμž…λ‹ˆλ‹€.
let hiWorld = "Hi World";

λ¬΄ν•œν•œ 수의 잠재적 μΌ€μ΄μŠ€λ“€ (λ¬Έμžμ—΄ 값은 경우의 μˆ˜κ°€ λ¬΄ν•œλŒ€)을 μœ ν•œν•œ 수의 잠재적 μΌ€μ΄μŠ€ (helloWorld의 경우: 1개)둜 μ€„μ—¬λ‚˜κ°€λŠ” 것을 νƒ€μž… 쒁히기 (narrowing)라 ν•œλ‹€.

λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ νƒ€μž… (String Literal Types)

μ‹€μ œλ‘œ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ νƒ€μž…μ€ μœ λ‹ˆμ–Έ νƒ€μž…, νƒ€μž… κ°€λ“œ 그리고 νƒ€μž… 별칭과 잘 κ²°ν•©λ©λ‹ˆλ‹€. 이런 κΈ°λŠ₯을 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄λ‘œ enumκ³Ό λΉ„μŠ·ν•œ ν˜•νƒœλ₯Ό κ°–μΆœ 수 μžˆμŠ΅λ‹ˆλ‹€.

// @errors: 2345
type Easing = "ease-in" | "ease-out" | "ease-in-out";

class UIElement {
  animate(dx: number, dy: number, easing: Easing) {
    if (easing === "ease-in") {
      // ...
    } else if (easing === "ease-out") {
    } else if (easing === "ease-in-out") {
    } else {
      // ν•˜μ§€λ§Œ λˆ„κ΅°κ°€κ°€ νƒ€μž…μ„ λ¬΄μ‹œν•˜κ²Œ λœλ‹€λ©΄
      // 이곳에 λ„λ‹¬ν•˜κ²Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€.
    }
  }
}

let button = new UIElement();
button.animate(0, 0, "ease-in");
button.animate(0, 0, "uneasy");

ν—ˆμš©λœ μ„Έ 개의 λ¬Έμžμ—΄μ΄ μ•„λ‹Œ λ‹€λ₯Έ λ¬Έμžμ—΄μ„ μ‚¬μš©ν•˜κ²Œ 되면 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

'"uneasy"' νƒ€μž…μ€ '"ease-in" | "ease-out" | "ease-in-out"' νƒ€μž…μ˜ 맀개 λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ νƒ€μž…μ€ μ˜€λ²„λ‘œλ“œλ₯Ό κ΅¬λ³„ν•˜λŠ” 것과 λ™μΌν•œ λ°©λ²•μœΌλ‘œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€:

function createElement(tagName: "img"): HTMLImageElement;
function createElement(tagName: "input"): HTMLInputElement;
// ... 좔가적인 쀑볡 μ •μ˜λ“€ ...
function createElement(tagName: string): Element {
  // ... 여기에 둜직 μΆ”κ°€ ...
}

μˆ«μžν˜• λ¦¬ν„°λŸ΄ νƒ€μž… (Numeric Literal Types)

TypeScriptμ—λŠ” μœ„μ˜ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄κ³Ό 같은 역할을 ν•˜λŠ” μˆ«μžν˜• λ¦¬ν„°λŸ΄ νƒ€μž…λ„ μžˆμŠ΅λ‹ˆλ‹€.

function rollDice(): 1 | 2 | 3 | 4 | 5 | 6 {
  return (Math.floor(Math.random() * 6) + 1) as 1 | 2 | 3 | 4 | 5 | 6;
}

const result = rollDice();

μ΄λŠ” 주둜 섀정값을 μ„€λͺ…ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€:

/** loc/lat μ’Œν‘œμ— 지도λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. */
declare function setupMap(config: MapConfig): void;
// ---μƒλž΅---
interface MapConfig {
  lng: number;
  lat: number;
  tileSize: 8 | 16 | 32;
}

setupMap({ lng: -73.935242, lat: 40.73061, tileSize: 16 });