Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript-使函数返回类型成为接口实现的类_Typescript_Generics_Return Type - Fatal编程技术网

Typescript-使函数返回类型成为接口实现的类

Typescript-使函数返回类型成为接口实现的类,typescript,generics,return-type,Typescript,Generics,Return Type,我有以下代码: export enum Side { Left = 'left', Right = 'right' } export interface Crosser { side: Side } export const crossersOnCorrectSide = function(crossers: Crosser[], correctSide: Side): Crosser|undefined { return crossers.find(cr

我有以下代码:

export enum Side {
    Left = 'left',
    Right = 'right'
}

export interface Crosser {
    side: Side 
}


export const crossersOnCorrectSide = function(crossers: Crosser[], correctSide: Side): Crosser|undefined {
    return crossers.find(crosser => { return crosser.side !== correctSide } ) 
}
问题是-我不希望返回类型是
Crosser | undefined
,而是希望返回类型是实现
Crosser
undefined
的类的类型

我尝试使用泛型并执行类型断言:

export const crossersOnCorrectSide = function<T>(crossers: Crosser[], correctSide: Side): T|undefined {

    let result = crossers.find(crosser => { return crosser.side !== correctSide } ) 

    if(result !== undefined) {
        return result as T
    } 

    return result 

    //return crossers.find(crosser => { return crosser.side !== correctSide } ) 
}
export const crossersOnCorrectSide=函数(crossers:Crosser[],correctSide:Side):T |未定义{
让result=crosser.find(crosser=>{return crosser.side!==correctSide})
如果(结果!==未定义){
将结果返回为T
} 
返回结果
//返回crosser.find(crosser=>{return crosser.side!==correctSide})
}
但我得到了“类型交叉器不能转换为类型T”


是否有任何“正确”的方法可以做到这一点,或者我将被迫使用
ts ignore
,或者更糟糕的是,这是一种糟糕的设计,我是否应该在收到
crossersOnCorrectSide
的输出后执行类型断言?

如果调用方已经在使用实现类型,您可以直接使用该类型:

export const crossersOnCorrectSide = function <T extends Crosser>(crossers: T[], correctSide: Side): T | undefined {

    let result = crossers.find(crosser => { return crosser.side !== correctSide } ) 

    if(result !== undefined) {
        return result
    } 
    else return undefined 
}
export const crossersOnCorrectSide=函数(crossers:T[],correctSide:Side):T |未定义{
让result=crosser.find(crosser=>{return crosser.side!==correctSide})
如果(结果!==未定义){
返回结果
} 
否则返回未定义
}

通常使用泛型来确保正确的返回类型,而无需调用方执行强制转换。但是,在调用函数时,您仍然需要知道要用于
T
的正确类型。函数尝试检测实际的底层类没有任何意义。

数组中的对象都是实现Crosser的同一类还是不同类?有许多不同的类实现了Crosser,但数组中的对象始终只属于一个类。谢谢!我建议进行一次编辑,使函数在调用时更加简洁,您可能想看一看。我想最终的答案取决于调用函数的数组是否为Crosser[]形式,或者是否已经使用了实现类型T[]。在前者中,函数为调用者执行强制转换,在后者中调用者已将其分类。下面是一个示例(使用您答案的编辑版本):
crossersOnCorrectSide(冒险家,puzzle.currentSide)
。数组
冒险家
类型为
冒险家[]
,类
冒险家
实现
交叉者
接口。