// 函数重载声明
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');
}
}