MST

星途 面试题库

面试题:TypeScript宽进严出策略与泛型约束的深度融合

设计一个TypeScript的通用函数`processData`,它接受一个数组和一个处理函数作为参数。这个通用函数需要遵循宽进严出策略,能够处理不同类型数组元素(例如数字、字符串等),并且处理函数的返回值类型要根据输入数组元素类型智能推断。同时,处理函数要对输入值有一定的类型检查(比如字符串长度大于0,数字大于10等)。请写出完整的TypeScript代码,并详细阐述在代码中是如何运用宽进严出策略以及泛型约束的。
29.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
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 来接受不同类型(stringnumber)的数组元素,使得函数可以处理多种类型的数组,而不需要针对每种类型写特定的函数,提高了函数的通用性。
  • 严出:根据输入数组元素类型 T,通过条件类型 T extends string? string : number 智能推断处理函数返回值类型,从而保证输出数组的类型是明确且严格的,避免了类型的不确定性。

泛型约束

通过 T extends string | number 对泛型 T 进行约束,限定 T 的类型只能是 string 或者 number,这确保了在函数内部可以针对这两种类型进行特定的类型检查,如字符串长度和数字大小的检查。