面试题答案
一键面试实现思路
- 首先定义
AdvancedRequired
工具类型,它接受两个类型参数T
(目标对象类型)和U
(条件类型)。 - 使用条件类型判断
U
是否为string
类型。 - 如果
U
是string
类型,对T
进行递归处理,将T
的所有属性变为必选。这里通过遍历T
的属性键,对每个属性值进行递归判断,如果属性值是对象类型,则继续应用AdvancedRequired
,如果不是对象类型则直接返回该类型。 - 如果
U
不是string
类型,直接返回T
。
代码实现
type AdvancedRequired<T, U> = U extends string
? {
[K in keyof T]-?: T[K] extends object
? AdvancedRequired<T[K], U>
: T[K];
}
: T;
示例使用:
type Example = {
a: string;
b?: number;
c: {
d: boolean;
e?: string;
};
};
type Result1 = AdvancedRequired<Example, string>;
// Result1 的类型为:{ a: string; b: number; c: { d: boolean; e: string; } }
type Result2 = AdvancedRequired<Example, number>;
// Result2 的类型为:Example