MST

星途 面试题库

面试题:TypeScript Required工具类型与条件类型、映射类型的深度结合应用

实现一个高级工具类型`AdvancedRequired`,它接受两个类型参数,第一个是目标对象类型,第二个是一个条件类型。如果条件类型满足特定条件(例如传入的是`string`类型),则对目标对象类型应用Required工具类型的功能,将所有属性变为必选;如果不满足条件,则保持目标对象类型不变。同时,要处理好目标对象类型可能存在的嵌套结构,确保递归地应用相应规则。请详细写出实现思路及代码。
33.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 首先定义AdvancedRequired工具类型,它接受两个类型参数T(目标对象类型)和U(条件类型)。
  2. 使用条件类型判断U是否为string类型。
  3. 如果Ustring类型,对T进行递归处理,将T的所有属性变为必选。这里通过遍历T的属性键,对每个属性值进行递归判断,如果属性值是对象类型,则继续应用AdvancedRequired,如果不是对象类型则直接返回该类型。
  4. 如果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