首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打字本:一般而非推断

打字本:一般而非推断
EN

Stack Overflow用户
提问于 2021-12-25 18:10:21
回答 1查看 90关注 0票数 0

我刚开始打字,来自Java/Kotlin。我有这样的剧本:

代码语言:javascript
复制
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正确推断:

代码语言:javascript
复制
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返回另一种类型的承诺时,类型记录不会给我编译错误,从而给出奇怪的情况。我希望响应类型是OrderFilled或OrderCancelled,但是sendMessage实际上可以解决完全不相关类型的承诺,而不存在任何编译错误,这会在运行时产生意外和未处理的异常。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-25 18:22:13

TS不是强类型语言,它的类型系统是关于形状的。也就是说,NewOrderRequestMessage不再是一个通用的。

如果您将其转换为RequestMessage<OrderFilled | OrderCancelled>,那么推断将运行得很好:

代码语言:javascript
复制
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)
})()

播放代码这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70481870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档