typescript - 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
,而是我希望返回类型是正在实现的类的类型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 } )
}
但我得到“Type Crosser 无法转换为 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
}
通常使用泛型来确保正确的返回类型,而调用者不必执行强制转换。但是,您仍然需要知道T
调用函数时要使用的正确类型。您的函数尝试检测实际的底层类没有任何意义。
推荐阅读
- sql - SQL 查询以查找不包含请求的代码类型的行
- hibernate - 捕获异常、更改实体、提交并重新抛出异常
- linux - 在 alpine docker 容器中创建用户的正确方法,以便 sudo 正常工作
- c# - Flutter-Framework, C# http server and an invalid JSON-Header s Invalid response status code
- php - PhP关联阵列更有效
- graphdb - 图形数据库经常挂起或不活动
- hbase - hbase Web UI 上的“其他区域”是什么意思?
- c# - 通过 int 开头从列表中获取数字
- c - C Segmentation Fault(Core Dump)无法弄清楚原因
- haskell - 如何在 Haskell 中使用 Control.DeepSeq 全面评估递归数据类型?