面试题答案
一键面试function processData<T extends string | number>(arr: T[], handler: (value: T) => T extends string ? string : number): (T extends string ? string : number)[] {
return arr.map((value) => {
if (typeof value ==='string') {
if (value.length === 0) {
throw new Error('字符串长度必须大于0');
}
} else if (typeof value === 'number') {
if (value <= 10) {
throw new Error('数字必须大于10');
}
}
return handler(value);
});
}
宽进严出策略
- 宽进:通过泛型
T
来接受不同类型(string
或number
)的数组元素,使得函数可以处理多种类型的数组,而不需要针对每种类型写特定的函数,提高了函数的通用性。 - 严出:根据输入数组元素类型
T
,通过条件类型T extends string? string : number
智能推断处理函数返回值类型,从而保证输出数组的类型是明确且严格的,避免了类型的不确定性。
泛型约束
通过 T extends string | number
对泛型 T
进行约束,限定 T
的类型只能是 string
或者 number
,这确保了在函数内部可以针对这两种类型进行特定的类型检查,如字符串长度和数字大小的检查。