TypeScript 매핑 타입(Mapped Types)은 기존 타입의 키를 순회하여 새 타입을 생성한다. { [K in keyof T]: ... } 문법을 사용한다.
기본 매핑
typescript
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};
type Partial<T> = {
[K in keyof T]?: T[K];
};
interface User { id: number; name: string; }
type ReadonlyUser = Readonly<User>;
// { readonly id: number; readonly name: string; }
키 수정자 (+/-)
typescript
// -readonly: readonly 제거
type Mutable<T> = {
-readonly [K in keyof T]: T[K];
};
// -?: 선택적 제거 (Required와 동일)
type Required<T> = {
[K in keyof T]-?: T[K];
};
as 절: 키 재매핑 (TypeScript 4.1+)
typescript
// 키를 변환
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};
interface Person { name: string; age: number; }
type PersonGetters = Getters<Person>;
// { getName: () => string; getAge: () => number; }
// 키 필터링 (never로 제거)
type NonFunctionKeys<T> = {
[K in keyof T as T[K] extends Function ? never : K]: T[K];
};
typescript
// 값 타입 변환
type Nullable<T> = {
[K in keyof T]: T[K] | null;
};
// 중첩 구조 처리
type DeepPartial<T> = {
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
};
interface Config {
server: { host: string; port: number };
debug: boolean;
}
type PartialConfig = DeepPartial<Config>;
// server?: { host?: string; port?: number }; debug?: boolean;
관련 개념