문제
인자로 T
와 K
두 개를 받는 제네릭 타입 RequiredByKeys<T, K>
을 구현하세요.K
는 T
의 프로퍼티들로 필수 타입이 되어야 합니다.K
가 전달되지 않는다면, Required<T>
와 동일하게 T
의 모든 프로퍼티들을 필수로 만들어야 합니다.
예시:
interface User {
name?: string
age?: number
address?: string
}
type UserRequiredName = RequiredByKeys<User, 'name'> // { name: string; age?: number; address?: string }
풀이
먼저 error 케이스부터 처리해줍니다.
K
에는 T
의 프로퍼티들만 전달되어야 합니다. 따라서 K extends keyof T
로 K의 값을 제한해줍니다.
K
로 인자가 전달되면 K
를 필수로 하고,
K
로 인자가 전달되지 않으면 모든 값을 필수로 바꿔야 합니다.
따라서 처음으로 전달된 T
와, K
의 값들을 필수로 바꾼 타입을 합성하는 방법을 택했습니다.
하지만 위와 같이 코드를 작성하면 RequiredByKeys
타입이 아래와 같아집니다.
type example1 = RequiredByKeys<User, "name">;
// { age?: number; address?: string; } & { name: string }
확장에 이어 ❗합성❗이 필요합니다.Merge
타입을 하나 만들어서 사용해줬습니다.
type Merge<T> = {
[K in keyof T]: T[K];
};
type RequiredByKeys<T, K extends keyof T = keyof T> = Merge<
T &
Required<{
[key in K]: T[key];
}>
>;
마지막으로 K가 전달되지 않는 경우에 대해 K에 디폴트 값으로 keyof T
를 할당해 줍니다.
'Frontend > Type-Challenge' 카테고리의 다른 글
[타입챌린지/type-challenge] Readonly (0) | 2023.01.26 |
---|---|
[타입챌린지/type-challenge] Pick (0) | 2023.01.26 |
[타입챌린지/type-challenge] Includes (2) | 2023.01.25 |
[타입챌린지/type-challenge] Awaited (0) | 2023.01.25 |
[타입챌린지/type-challenge] First of Array (0) | 2023.01.23 |