简体   繁体   English

Typescript:通用未推断

[英]Typescript : generic not inferred

I'm new to Typescript, coming from Java/Kotlin.我是 Typescript 的新手,来自 Java/Kotlin。 I have this script:我有这个脚本:

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

My problem is that result type is inferred as "unknown", while I expected it to be inferred to OrderFilled | OrderCancelled我的问题是结果类型被推断为“未知”,而我希望它被推断为OrderFilled | OrderCancelled OrderFilled | OrderCancelled , as the parameter of sendMessage is a RequestMessage<OrderFilled | OrderCancelled> OrderFilled | OrderCancelled ,因为 sendMessage 的参数是RequestMessage<OrderFilled | OrderCancelled> RequestMessage<OrderFilled | OrderCancelled>

Typically, in Java/Kotlin, the same logic makes result correctly inferred:通常,在 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)

In this equivalent Kotlin script, result is inferred to Promise<Int> .在这个等效的 Kotlin 脚本中,结果被推断为Promise<Int>

Why couldn't it be in Typescript?为什么不能在 Typescript 中? Due to this unknown type, Typescript doesn't give me error at compilation when sendMessage returns a Promise of another type, giving me weird situations.. I expect response type to be OrderFilled or OrderCancelled, but sendMessage can actually resolve to a promise of a completely unrelated type without having any compilation error, which produces unexpected and unhandled exception at runtime.由于这种未知类型,当 sendMessage 返回另一种类型的 Promise 时,Typescript 在编译时不会给我错误,这给我带来了奇怪的情况。我希望响应类型为 OrderFilled 或 OrderCancelled,但 sendMessage 实际上可以解析为 ZB321DE3BDC57DEFDEF8 的 ZB321DE3BDC57DEFDEF8完全不相关的类型,没有任何编译错误,这会在运行时产生意外和未处理的异常。

TS is not strongly typed language, its type system is about shape only. TS 不是强类型语言,它的类型系统只是关于形状。 That said NewOrderRequestMessage is no longer a generic.也就是说NewOrderRequestMessage不再是通用的。
If you cast it to RequestMessage<OrderFilled | OrderCancelled>如果您将其转换为RequestMessage<OrderFilled | OrderCancelled> RequestMessage<OrderFilled | OrderCancelled> then inferring will work just fine: 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)
})()

Play with the code here这里玩代码

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM