MST

星途 面试题库

面试题:TypeScript泛型约束与默认参数在元编程中的深度应用

实现一个TypeScript类型工具 `ApplyDefaults`,它接受两个类型参数 `T` 和 `Defaults`。`T` 是一个对象类型,`Defaults` 也是一个对象类型,用于为 `T` 中的某些属性提供默认值。使用泛型约束确保 `Defaults` 中的属性名是 `T` 中已有的属性名。同时,实现一个函数 `applyDefaults`,它接受两个参数,一个是类型为 `T` 的对象,另一个是类型为 `Defaults` 的对象,返回一个新的对象,新对象中 `T` 的属性如果在 `Defaults` 中有对应默认值,则使用默认值,否则使用原 `T` 对象中的值。请详细说明实现思路并完成代码。
42.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 类型工具 ApplyDefaults
    • 使用 keyof 操作符获取 TDefaults 的属性键类型。
    • 通过 Exclude 操作符找出 T 中不在 Defaults 中的属性键。
    • 使用条件类型和映射类型,对于 Defaults 中存在的属性,使用 Defaults 中的类型;对于 Defaults 中不存在的属性,使用 T 中的原类型。
  2. 函数 applyDefaults
    • 接受两个参数,分别为类型 TDefaults 的对象。
    • 使用 Object.assign 方法,先将 T 对象拷贝到一个新对象,然后将 Defaults 对象中存在的属性合并到新对象,实现属性默认值的应用。

代码实现

type ApplyDefaults<T, Defaults> = {
    [K in keyof T]: K extends keyof Defaults? Defaults[K] : T[K];
};

function applyDefaults<T, Defaults extends Partial<T>>(obj: T, defaults: Defaults): ApplyDefaults<T, Defaults> {
    return Object.assign({}, obj, defaults) as ApplyDefaults<T, Defaults>;
}