MST

星途 面试题库

面试题:深入理解TypeScript交叉与联合类型在泛型中的运用

编写一个泛型函数 `combine<T, U>`,它接受两个参数,第一个参数的类型是 `T` 或 `U` 的联合类型,第二个参数的类型是 `T` 和 `U` 的交叉类型。函数需要返回一个新的对象,该对象具有 `T` 和 `U` 的所有属性,并且要确保类型安全。同时,解释在这个泛型函数中,联合类型和交叉类型是如何协同工作来保证类型系统的准确性和灵活性的,以及在不同复杂场景下这种设计的潜在问题和解决方案。
40.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
function combine<T, U>(first: T | U, second: T & U): T & U {
    return {
      ...(first as T & U),
      ...second
    };
}

联合类型和交叉类型协同工作原理

  1. 联合类型:在 combine 函数中,first 参数的类型是 T | U,这意味着它可以是 T 类型或者 U 类型的值。这提供了灵活性,允许函数接受两种不同类型之一的输入。
  2. 交叉类型second 参数的类型是 T & U,它表示一个同时具有 TU 类型属性的对象。这种类型确保了函数接收到的第二个参数同时满足 TU 的类型约束。
  3. 类型安全的返回值:通过返回 T & U 类型,函数保证了返回的对象具有 TU 的所有属性,从而维护了类型系统的准确性。

潜在问题及解决方案

  1. 属性覆盖问题:如果 TU 有同名属性且类型不一致,在合并时会出现类型冲突。解决方案是在设计类型 TU 时,尽量避免同名属性且不一致的情况。如果无法避免,可以在合并时进行类型检查和处理,例如使用类型断言或自定义逻辑。
  2. 复杂类型嵌套:当 TU 是复杂的嵌套类型时,合并逻辑可能变得复杂。此时可以递归地处理嵌套结构,确保每个层级的类型安全。同时,可以使用类型别名或接口来简化复杂类型的定义和管理。
  3. 运行时类型检查:TypeScript 的类型系统主要在编译时起作用,运行时可能会因为不符合预期类型的数据输入而导致错误。可以在函数内部添加运行时类型检查(如 typeof 等操作符),以确保数据符合预期类型,增强程序的健壮性。