我正在尝试在TypeScript中创建一个简单的通用find函数,方法如下:
export function findFirst<T, U>(
array: T[],
predicate: (item: T) => boolean,
selector?: (item: T) => U): U {
...
}
因此,我的参数是:
-要过滤的数组
-测试每个元素的谓词
-选择器以获取返回值
我想做的是提供一个默认的选择器,即如果没有提供选择器,则只返回整个值,即:
if (typeof selector === "undefined")
selector = (x) => x;
但是,这(或什至(x) => <U>x
)破坏了函数的通用定义。如何在不删除通用参数的情况下实现默认选择器?
如果我使用如下代码:
var arr = [1,2,3,4];
var even = findFirst(arr, x => x % 2 === 0);
即返回第一个偶数,它推断y的类型为{}
ieobject
而不是数字。看来,由于只能从selector
参数中推断出U(在这种情况下是未定义的),因此U默认为object
。我知道我对类型推断的要求太多了,但是有什么办法解决吗?
这是完整的代码:
export function findFirst<T, U>(
array: T[],
predicate: (item: T) => boolean,
selector: (item: T) => U = (x:T)=> <U><any>x): U {
return array.filter(predicate).map(selector)[0];
}
原因<U><any>
:仅当T是U的子类型或U是T的子类型时,T
才能将类型断言为类型。由于这是不确定的,因此需要先转换为,然后才能断言为U
<any>
<U>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句