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)
。数组冒险家
类型为冒险家[]
,类冒险家
实现交叉者
接口。