[TECH-QA] "TypeScript์˜ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ: ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž… ํ™œ์šฉ๋ฒ•"

Partial<t></t>

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

type PartialUser = Partial<User>;
// PartialUser = { name?: string; age?: number; }
  • ๊ฐ์ฒด์˜ ์ผ๋ถ€ ์†์„ฑ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋ถ€๋ถ„์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉ.

Required<t></t>

interface User {
  name?: string;
  age?: number;
}

type RequiredUser = Required<User>;
// RequiredUser = { name: string; age: number; }
  • ํƒ€์ž… T์˜ ๋ชจ๋“  ์†์„ฑ์„ ํ•„์ˆ˜(required)๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์„ ํƒ์  ์†์„ฑ์„ ๊ฐ•์ œ๋กœ ํ•„์ˆ˜๋กœ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ.

Readonly<t></t>

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

type ReadonlyUser = Readonly<User>;
// ReadonlyUser = { readonly name: string; readonly age: number; }
  • ํƒ€์ž… T์˜ ๋ชจ๋“  ์†์„ฑ์„ ์ฝ๊ธฐ ์ „์šฉ(readonly)์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Pick<T, K>

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

type PickUser = Pick<User, 'name' | 'age'>;
// PickUser = { name: string; age: number; }
  • ํƒ€์ž… T์—์„œ ์ง€์ •๋œ ํ‚ค K๋งŒ ์„ ํƒํ•˜์—ฌ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Omit<T, K>

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

type OmitUser = Omit<User, 'email'>;
// OmitUser = { name: string; age: number; }
  • ํƒ€์ž… T์—์„œ ์ง€์ •๋œ ํ‚ค K๋ฅผ ์ œ์™ธํ•œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Record<K, T>

type Role = 'admin' | 'user' | 'guest';
type UserRecord = Record<Role, string>;
// UserRecord = { admin: string; user: string; guest: string; }
  • ํ‚ค ํƒ€์ž… K์™€ ๊ฐ’ ํƒ€์ž… T๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด ํƒ€์ž…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Exclude<T, U>

type MyUnion = 'a' | 'b' | 'c';
type Excluded = Exclude<MyUnion, 'a'>;
// Excluded = 'b' | 'c'
  • ํƒ€์ž… T์—์„œ U์— ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

Extract<T, U>

type MyUnion = 'a' | 'b' | 'c';
type Extracted = Extract<MyUnion, 'a' | 'b'>;
// Extracted = 'a' | 'b'
  • ํƒ€์ž… T์—์„œ U์— ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ํƒ€์ž…๋งŒ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

NonNullable<t></t>

type Nullable = string | null | undefined;
type NonNullableType = NonNullable<Nullable>;
// NonNullableType = string
  • null ๋˜๋Š” undefined๊ฐ€ ํฌํ•จ๋œ ํƒ€์ž…์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ.

ReturnType<t></t>

function getUser() {
  return { name: 'Alice', age: 30 };
}

type UserReturn = ReturnType<typeof getUser>;
// UserReturn = { name: string; age: number; }
  • ํ•จ์ˆ˜ ํƒ€์ž… T์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

Parameters<t></t>

function add(a: number, b: string): string {
  return `${a}${b}`;
}

type AddParams = Parameters<typeof add>;
// AddParams = [number, string]
  • ํ•จ์ˆ˜ ํƒ€์ž… T์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์„ ํŠœํ”Œ(tuple) ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠœํ”Œ์€ ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๊ณ ์ •๋œ ๊ธธ์ด์™€ ๊ฐ ์š”์†Œ์˜ ํƒ€์ž…์ด ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋œ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

Awaited<t></t>

type PromiseType = Promise<string>;
type ResolvedType = Awaited<PromiseType>;
// ResolvedType = string
  • Promise ํƒ€์ž… T์˜ ํ•ด๊ฒฐ(resolve) ํƒ€์ž…์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ ํƒ€์ž…์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ.

Uppercase<t> Lowercase<t>, Capitalize<t>, Uncapitalize<t></t></t></t></t>

type Greeting = 'hello world';
type UpperGreeting = Uppercase<Greeting>;
// UpperGreeting = 'HELLO WORLD'
type CapitalizedGreeting = Capitalize<Greeting>;
// CapitalizedGreeting = 'Hello world'
  • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์„ ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž, ์ฒซ ๊ธ€์ž ๋Œ€๋ฌธ์ž, ์ฒซ ๊ธ€์ž ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ.