全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页

高阶工具类型专题测试

8 题 90 分钟 难度:

考察知识点

  1. 条件类型: infer 推断、分布式条件类型、递归条件类型
  2. 模板字面类型: 字符串操作、模式匹配、类型转换
  3. 映射类型进阶: 键重映射、深度 Readonly/Partial、过滤属性
  4. 元组类型操作: 变元组类型、可变修饰符、元组转换
  5. 自定义工具类型: 组合工具类型、泛型约束、类型守卫
1
多选题

在 TypeScript 中,以下哪个(些)工具类型定义能够正确实现一个 DeepRequired<T>,使其递归地将对象类型 T 及其所有嵌套属性的可选修饰符移除(即所有属性变为 required)?

A

type DeepRequired<T> = T extends object ? { [K in keyof T]-?: DeepRequired<T[K]> } : T

B

type DeepRequired<T> = { [K in keyof T]-?: T[K] extends object ? DeepRequired<T[K]> : T[K] }

C

type DeepRequired<T> = T extends object ? { [K in keyof T]-?: NonNullable<T[K]> extends object ? DeepRequired<NonNullable<T[K]>> : NonNullable<T[K]> } : T

D

type DeepRequired<T> = Required<T> extends infer R ? R extends object ? { [K in keyof R]: DeepRequired<R[K]> } : R : never

2
多选题

给定一个类实例类型,我们希望提取其中所有返回值类型为 Promise<any> 的方法名,形成一个联合类型字符串。以下哪些实现方案是正确的?

A

type AsyncMethodNames<T> = { [K in keyof T]: T[K] extends (...args: any[]) => Promise<any> ? K : never }[keyof T]

B

type AsyncMethodNames<T> = keyof { [K in keyof T as T[K] extends (...args: any[]) => Promise<any> ? K : never]: T[K] }

C

type AsyncMethodNames<T> = T extends { [K: string]: (...args: any[]) => Promise<any> } ? keyof T : never

D

type AsyncMethodNames<T> = Extract<keyof T, { [K in keyof T]: T[K] extends (...args: any[]) => Promise<any> ? K : never }[keyof T]>

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>,要求:

  1. 递归地将对象类型 T 及其所有嵌套属性变为 readonly
  2. 正确处理数组类型(数组元素也需要深度只读)
  3. 正确处理 MapSet 等内置集合类型
  4. 对函数类型和原始类型不做修改
  5. 请解释你的实现中如何处理递归终止条件,以及为什么需要特殊处理数组和内置集合类型
5
多选题

在自定义复杂工具类型时,关于联合类型的分发行为,以下哪些说法是正确的?

A

条件类型T extends U ? X : Y中,当T是联合类型时会自动分发为多个独立判断

B

使用[T] extends [U]可以阻止条件类型的分发行为

C

所有工具类型都应该使用分发行为以获得更好的类型推导

D

NonNullable<T>是分发条件类型的典型应用

6
多选题

以下哪些是正确实现Omit<T, K>(从T中排除K属性)的方式?

A

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>

B

type Omit<T, K extends keyof T> = { [P in Exclude<keyof T, K>]: T[P] }

C

type Omit<T, K> = { [P in keyof T as P extends K ? never : P]: T[P] }

D

type Omit<T, K> = Required<T> & { [P in K]?: never }

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>工具类型,要求:

  1. 将U的属性合并到T中,U的优先级更高
  2. 如果T和U的某个同名属性都是对象类型,则递归合并
  3. 如果类型不同,U的类型覆盖T的类型
  4. 请给出实现并解释关键设计决策
← 上一个试卷 装饰器专题测试
下一个试卷 → 高阶文件声明专题测试

📝 发现内容有误?点击此处直接编辑

想参加完整模拟考试?
小程序提供计时考试、自动评分和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库