高阶工具类型专题测试
考察知识点
- 条件类型: infer 推断、分布式条件类型、递归条件类型
- 模板字面类型: 字符串操作、模式匹配、类型转换
- 映射类型进阶: 键重映射、深度 Readonly/Partial、过滤属性
- 元组类型操作: 变元组类型、可变修饰符、元组转换
- 自定义工具类型: 组合工具类型、泛型约束、类型守卫
1
多选题
在 TypeScript 中,以下哪个(些)工具类型定义能够正确实现一个 DeepRequired<T>,使其递归地将对象类型 T 及其所有嵌套属性的可选修饰符移除(即所有属性变为 required)?
2
多选题
给定一个类实例类型,我们希望提取其中所有返回值类型为 Promise<any> 的方法名,形成一个联合类型字符串。以下哪些实现方案是正确的?
3
填空题
请补全以下工具类型 RenameField<T, OldKey, NewKey>,使其能够将对象类型 T 中的指定属性 OldKey 重命名为 NewKey,同时保持其他属性和类型不变。
TypeScript
type RenameField<T, OldKey extends keyof T, NewKey extends string> =
Omit<T, OldKey> & !!1_Record<NewKey, T[OldKey]>!!
当使用 RenameField<{ name: string; age: number }, "name", "userName"> 时,结果类型应等价于 { age: number; userName: string }。
请写出 !!1!! 处应填入的类型工具名称。
4
简答题
请设计一个 TypeScript 工具类型 DeepReadonly<T>,要求:
- 递归地将对象类型 T 及其所有嵌套属性变为 readonly
- 正确处理数组类型(数组元素也需要深度只读)
- 正确处理
Map、Set等内置集合类型 - 对函数类型和原始类型不做修改
- 请解释你的实现中如何处理递归终止条件,以及为什么需要特殊处理数组和内置集合类型
5
多选题
在自定义复杂工具类型时,关于联合类型的分发行为,以下哪些说法是正确的?
6
多选题
以下哪些是正确实现Omit<T, K>(从T中排除K属性)的方式?
7
填空题
TypeScript
// 实现 DeepPartial<T>:递归地将对象 T 的所有属性变为可选
// 包括嵌套对象和数组中的对象也需要处理
type DeepPartial<T> = T extends object
? { [K in keyof T]?: !!1_答案!! }
: T;
// 测试
interface Nested {
a: {
b: { c: string };
};
items: { name: string }[];
}
type Result = DeepPartial<Nested>;
// 期望: {
// a?: { b?: { c?: string } };
// items?: { name?: string }[];
// }
8
简答题
请设计一个DeepMerge<T, U>工具类型,要求:
- 将U的属性合并到T中,U的优先级更高
- 如果T和U的某个同名属性都是对象类型,则递归合并
- 如果类型不同,U的类型覆盖T的类型
- 请给出实现并解释关键设计决策
📝 发现内容有误?点击此处直接编辑
想参加完整模拟考试?
小程序提供计时考试、自动评分和详细解析
长按或扫描二维码,立即体验