MST
星途 面试题库

面试题:TypeScript函数重载与泛型结合的深度应用

实现一个通用的 `processData` 函数,它既可以处理数组类型的数据,根据传入的操作类型(如求和、求平均值等)对数组元素进行相应计算并返回结果;也可以处理对象类型的数据,根据传入的键名获取对象对应的值。要求使用函数重载和泛型来实现,以确保类型安全,并且能够灵活适应不同的数据结构和操作需求。请详细阐述实现思路和关键点。
24.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 函数重载:定义多个同名函数,但参数列表或返回值类型不同,根据传入参数类型来决定调用哪个函数。
  2. 泛型:使用泛型来处理不同类型的数据,增加函数的通用性。对于数组,泛型 T 表示数组元素类型;对于对象,泛型 K 表示对象键的类型。

关键点

  1. 数组处理:根据操作类型进行不同的计算,如求和、求平均值等。
  2. 对象处理:根据传入的键名获取对象对应的值。
  3. 类型安全:通过函数重载和泛型确保在编译时就能发现类型错误。

代码实现(以 TypeScript 为例)

// 函数重载声明
function processData<T>(data: T[], operation: 'sum'): number;
function processData<T>(data: T[], operation: 'average'): number;
function processData<K extends keyof any>(data: Record<K, any>, key: K): any;

// 函数实现
function processData<T, K extends keyof any>(data: T[] | Record<K, any>, operationOrKey: 'sum' | 'average' | K): number | any {
    if (Array.isArray(data)) {
        if (operationOrKey === 'sum') {
            return (data as number[]).reduce((acc, val) => acc + val, 0);
        } else if (operationOrKey === 'average') {
            const sum = (data as number[]).reduce((acc, val) => acc + val, 0);
            return sum / (data as number[]).length;
        }
    } else {
        return (data as Record<K, any>)[operationOrKey];
    }
    throw new Error('Invalid operation or key');
}

使用示例

// 处理数组
const numbers = [1, 2, 3, 4, 5];
const sumResult = processData(numbers, 'sum');
const averageResult = processData(numbers, 'average');

// 处理对象
const obj = { name: 'John', age: 30 };
const nameResult = processData(obj, 'name');
const ageResult = processData(obj, 'age');