Typescript:未推断出泛型



我是Typescript的新手,来自Java/Kotlin。我有这个脚本:

class RequestMessage<ResponseType> {}
class NewOrderRequestMessage extends RequestMessage<OrderFilled | OrderCancelled> {}
async function sendMessage<T>(requestMessage:RequestMessage<T>): Promise<T> {
return new Promise<T>((resolve, reject) => {
// ...
})
}
(async () => {
let requestMessage = new NewOrderRequestMessage()
let result = await sendMessage(requestMessage)
})()

我的问题是,结果类型被推断为";"未知";,而我希望它被推断为OrderFilled | OrderCancelled,因为sendMessage的参数是RequestMessage<OrderFilled | OrderCancelled>

通常,在Java/Kotlin中,相同的逻辑可以正确推断result

class Promise<T>()
open class RequestMessage<T> {}
class NewOrderRequestMessage : RequestMessage<Int>() {}
fun <T> sendMessage(requestMessage: RequestMessage<T>): Promise<T> {
return Promise()
}
val requestMessage = NewOrderRequestMessage()
val result = sendMessage(requestMessage)

在这个等价的Kotlin脚本中,结果被推断为Promise<Int>

为什么不能用打字机?由于这种未知类型,当sendMessage返回另一种类型的Promise时,Typescript在编译时不会给我错误,这会给我带来奇怪的情况。。我希望响应类型是OrderFilled或OrderCancelled,但sendMessage实际上可以解析为完全无关类型的promise,而不会出现任何编译错误,这会在运行时产生意外且未处理的异常。

TS不是强类型语言,它的类型系统只是关于形状的。所述NewOrderRequestMessage不再是通用的
如果将其投射到RequestMessage<OrderFilled | OrderCancelled>,则推断会很好:

interface OrderFilled {
}
interface OrderCancelled {
}
class RequestMessage<ResponseType> {}
class NewOrderRequestMessage extends RequestMessage<OrderFilled | OrderCancelled> {}
type RequestMessageWithOrder  = RequestMessage<OrderFilled | OrderCancelled>
async function sendMessage<T>(requestMessage:RequestMessage<T>): Promise<T> {
return new Promise<T>((resolve, reject) => {
// ...
})
}
(async () => {
let requestMessage: RequestMessageWithOrder = new NewOrderRequestMessage()
let result = await sendMessage(requestMessage)
})()

在这里玩代码

最新更新