Generics Typescript中的泛型转换
我试图在TypeScript中创建一个简单的通用查找函数,大致如下:Generics Typescript中的泛型转换,generics,casting,typescript,Generics,Casting,Typescript,我试图在TypeScript中创建一个简单的通用查找函数,大致如下: export function findFirst<T, U>( array: T[], predicate: (item: T) => boolean, selector?: (item: T) => U): U { ... } 但是,这(甚至是(x)=>x)破坏了函数的一般定义。如何在不删除常规参数的情况下实现默认选择器 如果我使用如
export function findFirst<T, U>(
array: T[],
predicate: (item: T) => boolean,
selector?: (item: T) => U): U {
...
}
但是,这(甚至是(x)=>x
)破坏了函数的一般定义。如何在不删除常规参数的情况下实现默认选择器
如果我使用如下代码:
var arr = [1,2,3,4];
var even = findFirst(arr, x => x % 2 === 0);
i、 e.返回第一个偶数,它将y的类型推断为{}
,即对象
而不是数字。
似乎,由于U只能从选择器
参数推断,在本例中未定义该参数,因此U默认为对象
。
我知道我要求的类型推断有点太多了,但是有没有办法解决这个问题?因为
U
不一定是t
,所以需要使用any
将类型断言更改为不太具体:
selector = x => <any>x;
selector=x=>x;
以下是完整的代码:
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];
}
导出函数findFirst(
数组:T[],
谓词:(项:T)=>布尔值,
选择器:(项目:T)=>U=(x:T)=>x:U{
返回数组.filter(谓词).map(选择器)[0];
}
的原因:只有当T是U的子类型或U是T的子类型时,才能将TypeT
断言为TypeU
。因为这是不可确定的,所以需要先转换为
,然后才能断言为,您只需将默认值移动到参数声明中即可
function findFirst<T, U>(
array: T[],
predicate: (item: T) => boolean,
selector: (item: T) => U = (x => x)): U {
// ....
}
函数findFirst(
数组:T[],
谓词:(项:T)=>布尔值,
选择器:(项目:T)=>U=(x=>x)):U{
// ....
}
Tnx,至少编译器现在很高兴。是的,T
不能强制转换到U
,但是T
可以强制转换到任何然后可以强制转换到U
。谢谢,
function findFirst<T, U>(
array: T[],
predicate: (item: T) => boolean,
selector: (item: T) => U = (x => x)): U {
// ....
}