jaenny.dev
article thumbnail

문제

인자로 TK 두 개를 받는 제네릭 타입 RequiredByKeys<T, K>을 구현하세요.
KT의 프로퍼티들로 필수 타입이 되어야 합니다.
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를 할당해 줍니다.

profile

jaenny.dev

@jaenny.dev

Go Beyond! Front-end developer, jaenny✨