[Daily morning study] TypeScript의 Utility Types (Partial, Pick, Omit λ“±)

#daily morning study

Image


TypeScript의 Utility Types

TypeScriptλŠ” κ°œλ°œμžκ°€ λ”μš± 효율적으둜 μ½”λ“œ μž‘μ„±ν•  수 있게 λ•λŠ” μ—¬λŸ¬ λ‹€μ–‘ν•œ μœ ν‹Έλ¦¬ν‹° νƒ€μž…μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이 κ°€μ΄λ“œμ—μ„œλŠ” Partial, Pick, Omit, Record, Exclude, Extract와 같은 μ£Όμš” μœ ν‹Έλ¦¬ν‹° νƒ€μž…μ— λŒ€ν•΄ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

1. Partial

Partial<T> νƒ€μž…μ€ μ£Όμ–΄μ§„ νƒ€μž… T의 λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό 선택적(optional)으둜 λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€. 이 μœ ν‹Έλ¦¬ν‹°λŠ” νŠΉμ • 객체의 일뢀 ν”„λ‘œνΌν‹°λ§Œμ„ μ—…λ°μ΄νŠΈν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ

interface User {
  id: number;
  name: string;
  email: string;
}

const updateUser = (id: number, userUpdates: Partial<User>) => {
  // μ—…λ°μ΄νŠΈ 둜직
};

updateUser(1, { name: "μƒˆ 이름" });

μœ„ μ½”λ“œμ—μ„œ userUpdatesλŠ” User μΈν„°νŽ˜μ΄μŠ€μ˜ 선택적인 ν”„λ‘œνΌν‹°λ“€λ§Œ 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

2. Pick<T, K>

Pick<T, K> νƒ€μž…μ€ μ£Όμ–΄μ§„ νƒ€μž… Tμ—μ„œ νŠΉμ • ν”„λ‘œνΌν‹° K만 μ„ νƒν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ μƒμ„±ν•©λ‹ˆλ‹€. 주둜 큰 κ°μ²΄μ—μ„œ 일뢀 ν”„λ‘œνΌν‹°λ§Œ ν•„μš”ν•œ κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ

interface User {
  id: number;
  name: string;
  email: string;
}

type UserPreview = Pick<User, "id" | "name">;

const user1: UserPreview = {
  id: 1,
  name: "μ‚¬μš©μž1",
};

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” UserPreview νƒ€μž…μ΄ User νƒ€μž…μ—μ„œ id와 name ν”„λ‘œνΌν‹°λ§Œ μ„ νƒν•œ ν˜•νƒœμž…λ‹ˆλ‹€.

3. Omit<T, K>

Omit<T, K> νƒ€μž…μ€ Pickκ³ΌλŠ” λ°˜λŒ€λ‘œ, νŠΉμ • ν”„λ‘œνΌν‹° Kλ₯Ό μ œμ™Έν•œ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“­λ‹ˆλ‹€.

μ˜ˆμ‹œ

interface User {
  id: number;
  name: string;
  email: string;
}

type UserWithoutEmail = Omit<User, "email">;

const user2: UserWithoutEmail = {
  id: 2,
  name: "μ‚¬μš©μž2",
};

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” UserWithoutEmail νƒ€μž…μ΄ User νƒ€μž…μ—μ„œ email ν”„λ‘œνΌν‹°λ₯Ό μ œμ™Έν•œ ν˜•νƒœμž…λ‹ˆλ‹€.

4. Record<K, T>

Record<K, T> νƒ€μž…μ€ μ£Όμ–΄μ§„ ν‚€ K와 κ°’ Tλ₯Ό κ°€μ§„ 객체 νƒ€μž…μ„ μƒμ„±ν•©λ‹ˆλ‹€. 주둜 μ—¬λŸ¬ 개의 값이 λ™μΌν•œ νƒ€μž…μΌ λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ

type UserRoles = "admin" | "editor" | "viewer";
type RolePermissions = Record<UserRoles, string[]>;

const permissions: RolePermissions = {
  admin: ["read", "write", "delete"],
  editor: ["read", "write"],
  viewer: ["read"],
};

μœ„ μ½”λ“œμ—μ„œλŠ” UserRoles νƒ€μž…μ˜ 각 역할에 λŒ€ν•΄ κΆŒν•œμ„ μ •μ˜ν•˜λŠ” 객체λ₯Ό μƒμ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

5. Exclude<T, U>

Exclude<T, U>λŠ” μ£Όμ–΄μ§„ νƒ€μž… Tμ—μ„œ U에 ν•΄λ‹Ήν•˜λŠ” νƒ€μž…μ„ μ œμ™Έν•œ μƒˆλ‘œμš΄ νƒ€μž…μ„ μƒμ„±ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ

type AllNumbers = number | string | boolean;
type OnlyNumbers = Exclude<AllNumbers, string | boolean>; // number만 λ‚¨μŠ΅λ‹ˆλ‹€.

μœ„ μ½”λ“œμ—μ„œ OnlyNumbersλŠ” number νƒ€μž…λ§Œ ν¬ν•¨ν•©λ‹ˆλ‹€.

6. Extract<T, U>

Extract<T, U>λŠ” μ£Όμ–΄μ§„ νƒ€μž… T μ€‘μ—μ„œ U의 μ„œλΈŒνƒ€μž…μ„ μΆ”μΆœν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ μƒμ„±ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ

type AllNumbers = number | string | boolean;
type StringOrNumber = Extract<AllNumbers, string | number>; // string | number

μœ„ μ½”λ“œμ—μ„œ StringOrNumberλŠ” stringκ³Ό number νƒ€μž…λ§Œ ν¬ν•¨ν•©λ‹ˆλ‹€.

마무리

TypeScript의 μœ ν‹Έλ¦¬ν‹° νƒ€μž…λ“€μ€ νƒ€μž… 관리λ₯Ό 훨씬 μˆ˜μ›”ν•˜κ²Œ λ§Œλ“€μ–΄ μ£Όλ©°, μ½”λ“œμ˜ 가독성을 λ†’μ΄λŠ” 데 κΈ°μ—¬ν•©λ‹ˆλ‹€. 이런 μœ ν‹Έλ¦¬ν‹° νƒ€μž…λ“€μ„ 잘 ν™œμš©ν•˜λ©΄ λ”μš± 효율적이고 μ•ˆμ „ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 각 μœ ν‹Έλ¦¬ν‹° νƒ€μž…μ˜ μ‚¬μš© 사둀와 ν•¨κ»˜ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄λ©° μ΅ν˜€λ³΄μ„Έμš”!