MST

星途 面试题库

面试题:TypeScript函数重载与泛型的结合及优化

实现一个通用的 `processData` 函数,通过函数重载和泛型实现以下功能:1. 当传入的第一个参数是数组,第二个参数是一个返回布尔值的函数时,返回数组中满足该函数条件的元素组成的新数组;2. 当传入的第一个参数是单个值,第二个参数是一个返回字符串的函数时,返回该函数处理该值后的字符串结果。同时,请分析并优化该实现中可能存在的类型推断及性能问题。
44.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 函数重载声明
function processData<T>(arr: T[], callback: (item: T) => boolean): T[];
function processData<T>(value: T, callback: (val: T) => string): string;

// 函数实现
function processData<T>(arg1: T | T[], arg2: (item: T) => boolean | (val: T) => string): T[] | string {
    if (Array.isArray(arg1)) {
        const arr = arg1 as T[];
        const callback = arg2 as (item: T) => boolean;
        return arr.filter(callback);
    } else {
        const value = arg1 as T;
        const callback = arg2 as (val: T) => string;
        return callback(value);
    }
}

// 类型推断及性能问题分析与优化

// 类型推断问题:
// 1. 在函数实现中,通过 `if (Array.isArray(arg1))` 进行类型判断后,使用类型断言将 `arg1` 和 `arg2` 转换为对应的类型。
// 虽然这样能让代码正常工作,但类型断言会绕过类型检查,可能导致潜在的类型错误。
// 优化:可以使用类型保护函数,例如 `isArrayFilterCallback` 和 `isSingleValueCallback` 来进行更安全的类型推断。

// 性能问题:
// 1. 函数中有条件判断语句,每次调用 `processData` 都需要执行条件判断,这会带来一些额外的性能开销。
// 优化:如果应用场景中某一种情况调用频率远高于另一种,可以考虑将高频情况放在条件判断的前面,减少判断次数。

// 类型保护函数示例
function isArrayFilterCallback<T>(arg2: (item: T) => boolean | (val: T) => string): arg2 is (item: T) => boolean {
    return typeof (arg2 as (item: T) => boolean).length === 'number' && (arg2 as (item: T) => boolean).length === 1;
}

function isSingleValueCallback<T>(arg2: (item: T) => boolean | (val: T) => string): arg2 is (val: T) => string {
    return typeof (arg2 as (val: T) => string).length === 'number' && (arg2 as (val: T) => string).length === 1;
}

// 使用类型保护函数优化后的函数实现
function processDataOptimized<T>(arg1: T | T[], arg2: (item: T) => boolean | (val: T) => string): T[] | string {
    if (Array.isArray(arg1) && isArrayFilterCallback(arg2)) {
        return arg1.filter(arg2);
    } else if (!Array.isArray(arg1) && isSingleValueCallback(arg2)) {
        return arg2(arg1);
    } else {
        throw new Error('Invalid arguments');
    }
}