MST
星途 面试题库

面试题:TypeScript映射类型在复杂嵌套对象中的深度应用

给定一个复杂嵌套的对象类型,例如:`type NestedObject = { a: { b: string, c: number }; d: { e: { f: boolean } } }`。请使用TypeScript的映射类型实现一个深度克隆该对象类型的工具类型,并且在克隆过程中,所有字符串类型的属性变为只读,要求详细说明实现思路并给出代码示例。
29.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 首先,对于普通的映射类型,它只能处理一层对象的属性转换。要实现深度克隆,需要递归处理对象的嵌套属性。
    • 定义一个递归的映射类型,对于每个属性,如果它是对象类型,则递归调用该映射类型进行克隆;如果是字符串类型,将其变为只读;其他类型直接保留。
  2. 代码示例
type DeepReadonly<T> = {
    readonly [P in keyof T]: T[P] extends object
      ? DeepReadonly<T[P]>
       : T[P] extends string
          ? Readonly<T[P]>
           : T[P];
};

type NestedObject = { a: { b: string, c: number }; d: { e: { f: boolean } } };
type ClonedObject = DeepReadonly<NestedObject>;

在上述代码中,DeepReadonly 是定义的深度克隆且将字符串属性变为只读的工具类型。对于 NestedObject 使用 DeepReadonly 后得到 ClonedObjectClonedObject 中的所有字符串属性都是只读的,并且整个对象结构是深度克隆的。