[ts] Mapped type
Mapped type
Basic
Mapped type 예제.
type T1 = {[K in 'prop1' | 'prop2'] : boolean };
interface Person {
name: string;
age: number;
}
type MakeBoolean<T> = { [P in keyof T]? : boolean };
const pMap: MakeBoolean<Person> = {};
pMap.name = true;
pMap.age = false;
Modifier
readonly, optional과 같은 제어자를 추가 혹은 제거할 수 있다.
접근제어 추가
type User = {
name: string;
age: number;
}
// readonly property로 변환
type Readonly<Type> = {
readonly [Property in keyof Type ] : Type[Property];
}
// optional property로 변환
type Partial<Type> = {
[ Key in keyof Type ]? : Type[Key];
}
접근제어 제거
-readonly
, -?
를 통해서 각 속성을 제거할 수 있음.
// readonly 속성 제거
type CreateMutable<Type> = {
-readonly [Property in keyof Type]: Type[Property]
};
// optional 속성 제거
type Concrete<Type> {
[Property in keyof Type]-? : Type[Property];
}
활용 및 내장 타입
Readonly & Partial
type T2 = Person['name'];
type Readonly<T> = { readonly [P in keyof T]: T[P]};
// 모든 속성을 readonly
// 원래 내장 타입
type Partial<T> = {[P in keyof T]?: T[P]};
// 모든 속성을 optional
// 원래 내장 타입
type T3 = Readonly<Person>;
type T4 = Partial<Person>;
Pick
type Pick<T, K extends keyof T> = { [P in K]: T[P]};
// K에 입력한 key만을 속성으로 가지는 타입
// 내장 타입
interface Human {
name: string;
age: number;
language: string;
}
type HumanKey = keyof Human;
// type HumanKey = "name" | "language" | "age"
type T5 = Pick<Human, 'name' | 'language'>;
Record
type Record<K extends string, T> = { [P in K]: T};
// 내장 타입
type t6 = Record<'p1' | 'p2', Person>;
// === type t6 = {
// p1: Person;
// p2: Person;
// }
type t7 = Record<'p1' | 'p2', number>;
// === type t7 = {
// p1: number;
// p2: number;
// }
enum Fruit {
Apple,
Banana,
Orange, // 해당 필드 추가
}
// 아래의 경우는 enum을 추가해도 에러가 나지 않기 때문에
// 누락하는 실수를 할 수 있다.
const FRUIT_PRICE1 = {
[Fruit.Apple]: 1000,
[Fruit.Banana]: 1500,
}
// 아래의 경우에는 enum을 추가하면 에러가 나서
// 컴파일 타임에 에러를 잡을 수 있다.
const FRUIT_PRICE: { [key in Fruit]: number} = {
[Fruit.Apple]: 1000,
[Fruit.Banana]: 1500,
}
#타입스크립트/mapped-type