// 类型守卫函数示例,判断是否为数字
function isNumber(value: any): value is number {
return typeof value === 'number';
}
// 泛型函数filterArray
function filterArray<T>(array: T[], typeGuard: (value: any) => value is T): T[] {
return array.filter(typeGuard);
}
// 使用示例
const mixedArray = [1, 'two', 3];
const numbers = filterArray(mixedArray, isNumber);
// 这里numbers的类型会被准确推导为number[]
类型推导过程解释
- 类型守卫函数:
isNumber
函数是一个类型守卫,它接收一个any
类型的值,并返回一个布尔值,同时通过value is number
语法,告知TypeScript编译器,如果这个函数返回true
,那么传入的值就是number
类型。
- 泛型函数
filterArray
:
- 泛型参数
T
代表数组元素的类型。
array
参数是一个类型为T[]
的数组。
typeGuard
参数是一个类型守卫函数,它接收任意类型的值,并返回这个值是否为T
类型。
filterArray
函数内部使用数组的filter
方法,filter
方法会对数组中的每个元素调用typeGuard
函数,只有当typeGuard
返回true
时,该元素才会被保留在新数组中。由于typeGuard
确保了返回为true
时元素类型为T
,所以最终返回的新数组类型就是T[]
。在使用示例中,filterArray(mixedArray, isNumber)
,T
被推导为number
,所以numbers
的类型就是number[]
。