首页 > 解决方案 > Typescript - 使函数返回类型成为接口实现的类

问题描述

我有以下代码:

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,而是我希望返回类型是正在实现的类的类型Crosserundefined

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

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 } ) 
}

但我得到“Type Crosser 无法转换为 T 型”。

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

标签: typescriptgenericsreturn-type

解决方案


鉴于调用者已经在使用实现类型,您可以直接使用该类型:

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 
}

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


推荐阅读