// 定义类型谓词函数类型
type TypePredicate<T, U> = (value: T | U) => value is T;
// 泛型函数实现
function countTypes<T1, T2>(arr: (T1 | T2)[], typePredicate: TypePredicate<T1, T2>): { countT1: number; countT2: number } {
let countT1 = 0;
let countT2 = 0;
for (let item of arr) {
if (typePredicate(item)) {
countT1++;
} else {
countT2++;
}
}
return { countT1, countT2 };
}
类型推断增强代码灵活性和可读性的阐述
- 参数类型推断:泛型参数
T1
和T2
由传入的数组元素类型和类型谓词函数自动推断,无需手动指定。比如调用countTypes([1, 'a'], (value): value is number => typeof value === 'number')
,TypeScript 能根据传入的数组元素和类型谓词推断出T1
为number
,T2
为string
,使代码调用更简洁。
- 返回值类型推断:函数返回值类型
{ countT1: number; countT2: number }
无需手动声明,TypeScript 会根据函数内部逻辑推断出返回值类型,增强了代码的可读性,调用者无需关注具体实现就能知道返回值结构。