객체의 프로퍼티와 모든 하위 객체를 재귀적으로 읽기 전용으로 설정하는 제네릭 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를 호출합니다.