Generics 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)破坏了函数的一般定义。如何在不删除常规参数的情况下实现默认选择器 如果我使用如

我试图在TypeScript中创建一个简单的通用查找函数,大致如下:

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的子类型时,才能将Type
T
断言为Type
U
。因为这是不可确定的,所以需要先转换为
,然后才能断言为

,您只需将默认值移动到参数声明中即可

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 {
       // ....
}