面试题答案
一键面试- 实现思路:
- 首先,对于普通的映射类型,它只能处理一层对象的属性转换。要实现深度克隆,需要递归处理对象的嵌套属性。
- 定义一个递归的映射类型,对于每个属性,如果它是对象类型,则递归调用该映射类型进行克隆;如果是字符串类型,将其变为只读;其他类型直接保留。
- 代码示例:
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
后得到 ClonedObject
,ClonedObject
中的所有字符串属性都是只读的,并且整个对象结构是深度克隆的。