MST

星途 面试题库

面试题:TypeScript泛型在静态类型检查中的复杂应用问题

编写一个通用的函数 `combineArrays`,它接受两个数组作为参数,这两个数组的元素类型可以不同,但需要通过泛型来确保它们在函数内部操作时类型的正确性。函数要返回一个新数组,新数组由两个输入数组的所有元素组成。同时,假设你调用 `combineArrays` 时传入了两个数组,其中一个数组元素类型在后续代码中有更具体的子类型扩展需求,如何在静态类型检查时保证类型兼容性,避免运行时错误?
22.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
function combineArrays<T, U>(arr1: T[], arr2: U[]): (T | U)[] {
    return [...arr1, ...arr2];
}

// 假设后续有更具体的子类型扩展需求,例如:
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

const animals: Animal[] = [];
const dogs: Dog[] = [];
const cats: Cat[] = [];

// 使用时,通过类型约束确保兼容性
const allAnimals: Animal[] = combineArrays(animals, dogs) as Animal[];
const allPets: Animal[] = combineArrays(dogs, cats) as Animal[];
  1. 函数实现
    • 使用泛型 TU 分别代表两个输入数组的元素类型。
    • 函数 combineArrays 通过展开运算符 ... 将两个数组合并为一个新数组并返回,新数组的类型为 (T | U)[],表示包含 T 类型和 U 类型元素的数组。
  2. 类型兼容性处理
    • 假设存在父类 Animal 以及子类 DogCat
    • 当调用 combineArrays 时,如果后续代码需要将结果作为 Animal 类型处理,可以通过类型断言 as Animal[] 来确保静态类型检查时的类型兼容性,避免运行时错误。这样做能告诉编译器,合并后的数组元素类型可以安全地当作 Animal 类型处理,即使它们实际可能是 Animal 的子类型。