面试题答案
一键面试实现思路
- 首先,定义一个基础的条件类型来处理对象类型。
- 使用
keyof
操作符获取对象的所有键。 - 通过
in
关键字进行遍历,为每个键创建只读属性。 - 对于属性值,如果它是对象类型,则递归调用
DeepReadonly
来处理嵌套对象。 - 如果属性值是数组类型,同样递归处理数组元素。
代码实现
type DeepReadonly<T> =
T extends Array<infer U>
? ReadonlyArray<DeepReadonly<U>>
: T extends object
? {
readonly [P in keyof T]: DeepReadonly<T[P]>;
}
: T;
每一步解释
- 数组处理:
T extends Array<infer U>
? ReadonlyArray<DeepReadonly>
- `T extends Array<infer U>` 检查 `T` 是否为数组类型,如果是,则推断出数组元素类型 `U`。
- `ReadonlyArray<DeepReadonly<U>>` 创建一个只读数组,数组元素类型是递归处理后的 `U`。
2. **对象处理**:
```typescript
T extends object
? {
readonly [P in keyof T]: DeepReadonly<T[P]>;
}
T extends object
检查T
是否为对象类型。keyof T
获取对象T
的所有键。[P in keyof T]
遍历对象的所有键P
。readonly [P in keyof T]: DeepReadonly<T[P]>
为每个键P
创建一个只读属性,属性值是递归处理后的T[P]
。
- 其他类型处理:
如果: T;
T
既不是数组也不是对象,则直接返回T
,保持原类型不变。