我是 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>。
為什么不能在 Typescript 中?由于這種未知型別,當 sendMessage 回傳另一種型別的 Promise 時,Typescript 在編譯時不會給我錯誤,這給我帶來了奇怪的情況。我希望回應型別是 OrderFilled 或 OrderCancelled,但 sendMessage 實際上可以決議為一個承諾完全不相關的型別,沒有任何編譯錯誤,這會在運行時產生意外和未處理的例外。
uj5u.com熱心網友回復:
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)
})()
在這里玩代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/394604.html
上一篇:無法創建發送方/接收方協議
下一篇:在Rust中,如何組合兩個相同的函式,但一個接受&Vec<String>而另一個接受&Vec<&String>?
