面试题答案
一键面试function processArray<T, U extends T>(arr: T[], callback: (item: U) => void): void {
for (const item of arr) {
callback(item as U);
}
}
- 泛型类型约束:
T
是数组元素的类型。U extends T
表示U
是T
及其子类型。这确保了回调函数callback
只能处理T
及其子类型的元素。例如,如果T
是number
,U
可以是number
或者number
的子类型(在JavaScript/TypeScript中,没有特别细分的数字子类型,但在其他场景可能有意义,比如1
是number
的“子类型” 这样的概念)。
- 条件类型:这里虽然没有典型的三元条件类型(
A extends B? C : D
),但是U extends T
这种泛型类型约束其实隐含了条件判断的意味。它保证了U
与T
的类型关系,只有满足这种关系,函数才能正确处理数组元素和回调函数的参数类型匹配,从而确保类型安全。
例如使用方式:
const numbers = [1, 2, 3];
processArray(numbers, (num) => {
console.log(num * 2);
});