T
에서 K
프로퍼티만 선택해 새로운 오브젝트 타입을 만드는 내장 제네릭 Pick<T, K>
을 이를 사용하지 않고 구현하세요.
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = MyPick<Todo, "title" | "completed">;
const todo: TodoPreview = {
title: "Clean room",
completed: false,
};
type MyPick<T, K extends keyof T> = {
[P in K] : T[P]
}
TodoPreview
가MyPick
과 일단 같아야 된다.
- Todo의 type은
title, description, completed를 key로 하는 객체(interface)
이다.
- MyPick이 통과 하려면 일단 MyPick은
객체
가 되어야 한다.
key는 Todo 타입인 K, value는 T[K]
- 내장 지네릭은
객체 안에 들어올 수 있는 타입을 정하도록 도와주는 개념
이라고 이해했다.
들어오는 타입의 매개변수 화
- MyPick의 지네릭을 보면
<T, K>
인데 만약{[P in K] : T[P]}
이라고 할 경우,K가 만약 todo의 key가 아닌 다른 타입의 키
가 오면error 발생
한다.
Todo의 타입
이 될 수 있도록 해야한다.K extends keyof T
라고 하여 K의 key는 T에 있는 key
가 되도록 했다.Pick<T, K>
- T 타입으로부터 K 프로퍼티만 추출하도록 도와주는
유틸리티
타입- 즉,
T 내에서
Union 타입k의 프로퍼티에 대한 타입들을 뽑아내는 것
Ex)
interface Event {
id: string;
title: string;
isDone: boolean;
startDate: string;
};
type BaseInfo = Pick<Event, 'id' | 'title'>;
interface PickedEvent {
id: string;
title: string;
};
keyof
어떤 객체의 타입 or 인터페이스의 key들만 뽑아오는 경우
사용Object.keys(Obj)
와 유사한 개념interface Brand {
Nike: 'nike';
Adidas: 'adidas';
Puma: 'puma';
}
let type: keyof Brand
'Nike' | 'Adidas' | 'Puma'
라는 Union 타입이 되도록 해야 하는 것typeof
객체 or Enum
을 interface
로 만들고 싶을 경우 사용enum Brand = {
Nike = 'nike',
Adidas = 'adidas',
Puma = 'puma'
}
let type : typeof Brand