Programming/TypeScript

[TypeScript] νƒ€μž…μŠ€ν¬λ¦½νŠΈ μœ ν‹Έλ¦¬ν‹° νƒ€μž… Omit μ•Œμ•„λ³΄κΈ°

yuri lee 2024. 11. 28. 21:21
λ°˜μ‘ν˜•

Intro

μ•ˆλ…•ν•˜μ„Έμš”. 이번 μ‹œκ°„μ—λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ μœ ν‹Έλ¦¬ν‹° νƒ€μž…μΈ Omit에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

참고둜 μœ ν‹Έλ¦¬ν‹° νƒ€μž… (Utility Types)은 TypeScriptμ—μ„œ κΈ°μ‘΄ νƒ€μž…μ„ λ³€ν˜•ν•˜κ±°λ‚˜ ν™•μž₯ν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ μ‰½κ²Œ 생성할 수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” λ‚΄μž₯ νƒ€μž…λ“€μž…λ‹ˆλ‹€. TypeScriptλŠ” κ°•λ ₯ν•œ νƒ€μž… μ‹œμŠ€ν…œμ„ μ œκ³΅ν•˜λŠ” λ™μ‹œμ—, λ³΅μž‘ν•œ νƒ€μž… μ •μ˜λ₯Ό λ‹¨μˆœν™”ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ κ°€μ§€ μœ ν‹Έλ¦¬ν‹° νƒ€μž…μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이 νƒ€μž…λ“€μ€ νŠΉμ •ν•œ μž‘μ—…(예: 선택적 ν•„λ“œλ‘œ λ³€ν™˜, νŠΉμ • 속성 제거 λ“±)을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ 미리 μ •μ˜λœ ν…œν”Œλ¦Ώμ²˜λŸΌ μž‘λ™ν•©λ‹ˆλ‹€.

 

Omit κΈ°λ³Έ 문법

Omit은 TypeScriptμ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° νƒ€μž… μ€‘ ν•˜λ‚˜λ‘œ, νŠΉμ • κ°μ²΄ νƒ€μž…μ—μ„œ μ§€μ •λœ ν‚€λ₯Ό μ œκ±°ν•œ μƒˆλ‘œμš΄ νƒ€μž…을 μƒμ„±ν•˜λŠ” λ° μ‚¬μš©λ©λ‹ˆλ‹€. μ΄ μœ ν‹Έλ¦¬ν‹° νƒ€μž…은 κ°μ²΄μ˜ μΌλΆ€ ν”„λ‘œνΌν‹°λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€λ‘œ μƒˆλ‘œμš΄ νƒ€μž…을 μ •μ˜ν•  λ•Œ λ§€μš° μœ μš©ν•©λ‹ˆλ‹€.

Omit<Type, Keys>
  • Type: κΈ°μ‘΄ 객체 νƒ€μž…
  • Keys: μ œμ™Έν•˜κ³ μž ν•˜λŠ” ν”„λ‘œνΌν‹°(ν‚€)λ“€μ˜ μ§‘ν•©. λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ΄λ‚˜ μœ λ‹ˆμ˜¨ νƒ€μž…μœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.

 

Omit λ™μž‘ 방식

Omit은 기본적으둜 λ‹€μŒκ³Ό 같이 κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. Omit은 κΈ°μ‘΄ νƒ€μž…μ—μ„œ νŠΉμ • ν‚€λ₯Ό μ œμ™Έν•œ μƒˆλ‘œμš΄ νƒ€μž…을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
  • keyof T: T νƒ€μž…μ˜ λͺ¨λ“  ν‚€λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. 
  • Exclude<keyof T, K>: K에 ν•΄λ‹Ήν•˜λŠ” ν‚€λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ ν‚€λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. 
  • Pick<T, ...>: νŠΉμ • ν‚€λ“€λ§Œ μ„ νƒν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“­λ‹ˆλ‹€.

 

Omit Example

1. κ°„λ‹¨ν•œ μ‚¬μš©

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

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

const user: UserWithoutEmail = {
  id: 1,
  name: "John",
  age: 30,
};

 

2. μ—¬λŸ¬ ν‚€ μ œμ™Έν•˜κΈ°

type UserWithoutSensitiveInfo = Omit<User, "email" | "age">;

const user2: UserWithoutSensitiveInfo = {
  id: 2,
  name: "Alice",
};

 

μ‹€μš©μ μΈ ν™œμš© 사둀

1. API 응닡 필터링: λ―Όκ°ν•œ 데이터λ₯Ό μ œμ™Έν•œ 객체 νƒ€μž…μ„ μ •μ˜ν•  λ•Œ μ‚¬μš©

type SafeUser = Omit<User, "email" | "password">;

 

2. μ»΄ν¬λ„ŒνŠΈ Props 관리: νŠΉμ • μ»΄ν¬λ„ŒνŠΈμ—μ„œ 일뢀 Propsλ₯Ό μ œμ™Έν•œ μƒˆλ‘œμš΄ Props νƒ€μž… 생성

interface ButtonProps {
  onClick: () => void;
  color: string;
  disabled: boolean;
}

type ButtonWithoutOnClick = Omit<ButtonProps, "onClick">;

 

3. Redux μ•‘μ…˜ λ°μ΄ν„°μ—μ„œ λΆˆν•„μš”ν•œ ν•„λ“œ 제거

type ActionPayload = Omit<User, "id">;

 

 

Omit은 κΈ°μ‘΄ νƒ€μž…μ—μ„œ νŠΉμ • ν‚€λ₯Ό μ œκ±°ν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 데 μ΅œμ ν™”λœ μœ ν‹Έλ¦¬ν‹° νƒ€μž…μž…λ‹ˆλ‹€. 데이터 필터링, νƒ€μž… 관리, Props μ •μ˜ λ“± λ‹€μ–‘ν•œ μƒν™©μ—μ„œ ν™œμš©λ  수 μžˆμ–΄ TypeScript κ°œλ°œμ—μ„œ 맀우 μœ μš©ν•©λ‹ˆλ‹€ :)

λ°˜μ‘ν˜•