패스잇
프론트엔드 개발 · 심화

중첩된 객체 구조에서 깊은(deep) 불변성(immutability)을 강제하는 TypeScript 타입을 어떻게 설계할 수 있을까요? 특히, 재귀적 타입 정의와 Mapped Types를 조합하여 모든 속성이 `readonly`인 중첩 객체 타입을 생성하는 고급 기법을 설명해주세요.

힌트 · 인덱스 시그니처와 조건부 타입을 사용하여 객체의 속성이 객체인 경우 재귀적으로 `DeepReadonly` 타입을 적용하고, 그렇지 않은 경우 `readonly`를 적용하는 방식으로 구현할 수 있습니다.

재귀적 타입Mapped TypesDeep Readonly타입 추론조건부 타입

모범답안

네, "중첩된 객체 구조에서 깊은 불변성을 강제하는 TypeScript 타입 설계"에 대한 답변 드리겠습니다.

TypeScript에서 깊은 불변성을 구현하려면 재귀적 타입과 Mapped Types를 활용해야 합니다. 먼저, Mapped Types를 사용하여 객체의 모든 속성을 readonly로 만들 수 있습니다. 핵심은 조건부 타입을 사용하여 속성이 객체인지 확인하고, 객체라면 재귀적으로 DeepReadonly 타입을 적용하는 것입니다.

type DeepReadonly<T> = {
  readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};

이 타입은 객체의 각 키에 대해, 해당 키의 타입이 객체이면 DeepReadonly를 재귀적으로 적용하고, 그렇지 않으면 readonly를 적용합니다. 이렇게 하면 중첩된 모든 객체의 속성이 불변하게 됩니다. 인덱스 시그니처를 통해 객체의 모든 속성에 접근하고, 조건부 타입을 통해 타입 추론을 수행하여 깊은 불변성을 효과적으로 구현할 수 있습니다.

읽었다면, 이제 직접 답해볼 차례예요

패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.

함께 보는 TypeScript 면접 질문

← TypeScript 면접 질문 전체 보기