MST

星途 面试题库

面试题:TypeScript泛型在复杂算法组合中的深度应用

设计一个包含多种算法(如排序、查找、数据过滤)的工具库,要求使用TypeScript泛型来实现高度可复用和类型安全的代码。详细阐述泛型如何在这些算法的组合与交互中,保证数据类型的一致性和系统的扩展性,并且要考虑到不同算法之间可能存在的类型依赖和转换问题。
13.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

1. 排序算法实现

// 泛型排序函数,使用冒泡排序示例
function sort<T extends number | string>(arr: T[]): T[] {
    const newArr = [...arr];
    for (let i = 0; i < newArr.length - 1; i++) {
        for (let j = 0; j < newArr.length - 1 - i; j++) {
            if ((newArr[j] as number) > (newArr[j + 1] as number)) {
                [newArr[j], newArr[j + 1]] = [newArr[j + 1], newArr[j]];
            }
        }
    }
    return newArr;
}

2. 查找算法实现

// 泛型查找函数,使用线性查找示例
function find<T>(arr: T[], target: T): number {
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] === target) {
            return i;
        }
    }
    return -1;
}

3. 数据过滤算法实现

// 泛型数据过滤函数
function filter<T>(arr: T[], callback: (item: T) => boolean): T[] {
    const result: T[] = [];
    for (let i = 0; i < arr.length; i++) {
        if (callback(arr[i])) {
            result.push(arr[i]);
        }
    }
    return result;
}

4. 泛型在算法组合与交互中的作用

  • 保证数据类型一致性:通过泛型 T,在不同算法(排序、查找、过滤)中,输入和输出的数据类型保持一致。例如,sort 函数接收 T[] 类型数组,返回 T[] 类型数组;find 函数接收 T[] 类型数组和 T 类型目标值,返回 number 类型索引。这确保了在整个工具库中,数据类型的正确性,避免类型错误。
  • 系统扩展性:泛型使得算法可以应用于多种数据类型,而不需要为每种数据类型单独编写算法。例如,sort 函数可以对 number[]string[] 进行排序,若未来有新的数据类型需要排序,只要该类型支持比较操作,即可直接使用 sort 函数,无需修改函数代码。

5. 处理类型依赖和转换问题

  • 类型依赖:在算法交互时,某些算法可能依赖于其他算法的输出类型。例如,先使用 filter 过滤数据,再对过滤后的数据使用 sort 排序。由于泛型 T 的一致性,保证了 filter 输出的数组类型与 sort 输入的数组类型相同,从而避免类型不匹配问题。
  • 类型转换:在实际应用中,可能需要对数据进行类型转换。例如在 sort 函数中,当 Tnumber 类型时,可以直接比较大小;但如果 T 为自定义类型,可能需要定义比较函数。可以通过在泛型中添加约束,如 T extends { compareTo: (other: T) => number },来确保类型具有比较方法,从而实现类型安全的转换和操作。同时,在不同算法间传递数据时,要确保数据类型的兼容性,避免因类型转换错误导致运行时错误。