Deep Readonly - medium - [Type Challenge]

강성훈·2023년 1월 26일
0

type-challenges

목록 보기
17/20
post-thumbnail

by Anthony Fu @antfu

문제

객체의 프로퍼티와 모든 하위 객체를 재귀적으로 읽기 전용으로 설정하는 제네릭 DeepReadonly<T>를 구현하세요.

이 챌린지에서는 타입 파라미터 T를 객체 타입으로 제한하고 있습니다. 객체뿐만 아니라 배열, 함수, 클래스 등 가능한 다양한 형태의 타입 파라미터를 사용하도록 도전해 보세요.

type X = { 
  x: { 
    a: 1
    b: 'hi'
  }
  y: 'hey'
}

type Expected = { 
  readonly x: { 
    readonly a: 1
    readonly b: 'hi'
  }
  readonly y: 'hey' 
}

type Todo = DeepReadonly<X> // should be same as `Expected`

솔루션

재귀를 사용하여 구현할 것 입니다.
만약 객체 타입이라면 다시한번 DeepReadonly를 호출하는 방식으로 작동합니다.

type DeepReadonly<T> = {
  readonly [t in keyof T]: T[t] extends Record<any, unknown>
    ? DeepReadonly<T[t]>
    : T[t];
};

Record 제네릭을 타입스크립트 내장 제네릭으로 다음 코드는 다음과 같은 역할을 합니다.

type ObjectType = {
    [x: string]: unknown;
}

즉 객체 타입인 것 입니다.

따라서 만약 T[t]가 객체타입이라면 다시 한번 호출하고 아니라면 그냥 값을 반환하는 방식으로 작동합니다.

처음 DeepReadonly를 호출하게되면 다음과 같이 되는 것입니다.

type Result = {
    readonly x: DeepReadonly<{
        a: 1;
        b: "hi";
    }>;
    readonly y: "hey";
}

이렇게 끊임없이 내부로 DeepReadonly를 호출합니다.

profile
고등학생 주니어 개발자

0개의 댓글