includes

const actions = [
  "CREATE",
  "READ",
  "UPDATE",
  "DELETE"
] as const;
// readonly ["CREATE", "READ", "UPDATE", "DELETE"]

const execute = (action: string) => {
  if (actions.includes(action)) {
    // πŸ’₯ ERROR
  }
};

Argument of type 'string' is not assignable to parameter of type 'CREATE' | 'READ' | 'UPDATE' | 'DELETE' . = Error 2345

interface Array<T> {
  includes(searchElement: T, fromIndex?: number): boolean;
}

interface ReadonlyArray<T> {
  includes(searchElement: T, fromIndex?: number): boolean;
}

Array<T>와 ReadonlyArray<T>의 선언을 μ‚΄νŽ΄λ³΄λ©΄ μ°ΎμœΌλ €λŠ” μš”μ†Œ(searchElement)의 νƒ€μž…κ³Ό 배열이 λ‹΄κ³ μžˆλŠ” κ°’μ˜ νƒ€μž…μ΄ 동일해야 ν•œλ‹€.

μ΄λ•Œ string은 T('CREATE' | 'READ' | 'UPDATE' | 'DELETE')보닀 훨씬 넓은 νƒ€μž…μ΄λ―€λ‘œ νƒ€μž… μΊμŠ€νŒ…μ„ μ΄μš©ν•΄ νƒ€μž…μ„ μ’ν˜€μ£Όμ–΄μ•Ό ν•œλ‹€.

function includes<T extends U, U>(
  array: ReadonlyArray<T>,
  element: U
): element is T {
  return array.includes(element as T);
}

μ΅œμ’…μ μœΌλ‘œλŠ” T κ°€ U λ₯Ό ν™•μž₯(extends)ν•˜λŠ” μ§€ κ²€μ¦ν•˜λ©°, μ΄λŠ” Uκ°€ T의 μƒμœ„ μ§‘ν•©(superset) ν˜Ήμ€ Tκ°€ U의 ν•˜μœ„ μ§‘ν•©(subset)μž„μ„ 보μž₯ ν•  수 있게 λœλ‹€.

Last updated