MST

星途 面试题库

面试题:TypeScript泛型约束的高级定制与优化

在TypeScript中,实现一个泛型函数 `mergeObjects`,该函数接受两个对象作为参数,并将它们合并成一个新对象。要求使用泛型约束确保这两个对象具有相同的键类型,并且值类型也满足特定关系(例如,第二个对象中对应键的值类型是第一个对象中对应键值类型的子类型)。阐述这种复杂泛型约束在大型项目架构设计中的潜在应用场景,以及如何避免因泛型约束过度复杂而带来的维护成本问题。
22.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现 mergeObjects 函数

function mergeObjects<
  K extends keyof any, 
  V1, 
  V2 extends V1
>(obj1: Record<K, V1>, obj2: Record<K, V2>): Record<K, V1> {
  const result: Record<K, V1> = {} as Record<K, V1>;
  for (const key in obj1) {
    if (Object.prototype.hasOwnProperty.call(obj1, key)) {
      result[key] = obj1[key];
    }
  }
  for (const key in obj2) {
    if (Object.prototype.hasOwnProperty.call(obj2, key)) {
      result[key] = obj2[key];
    }
  }
  return result;
}

复杂泛型约束在大型项目架构设计中的潜在应用场景

  1. 类型安全的数据层操作:在大型项目中,数据从不同的数据源获取,例如API响应数据和本地缓存数据。通过泛型约束可以确保数据的一致性和类型安全。比如,API响应的数据类型是父类型,本地缓存的数据类型是子类型,在合并数据时使用这种泛型约束可以避免类型错误。
  2. 组件化开发:在组件库开发中,不同的组件可能需要接受不同类型但又有继承关系的数据。例如,一个基础组件接受一种通用类型的数据,而其扩展组件接受更具体的子类型数据。泛型约束可以确保组件之间数据传递的正确性。

避免因泛型约束过度复杂而带来的维护成本问题

  1. 文档化:对复杂的泛型约束进行详细的文档说明,解释每个类型参数的含义、约束条件以及它们在函数或类中的作用。这有助于其他开发者理解代码意图,降低维护难度。
  2. 逐步抽象:不要一开始就设计过于复杂的泛型约束。可以从简单的场景开始,逐步增加约束条件。通过这种方式,更容易理解和调试代码,同时也方便在后续维护中进行修改。
  3. 测试:编写全面的单元测试来验证泛型约束的正确性。确保在各种边界条件下,代码都能按照预期工作。这不仅能保证功能的正确性,也有助于发现因泛型约束修改而引入的潜在问题。