打字稿:一般不推断
Typescript : generic not inferred
我是 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 returns 是另一种类型的 Promise 时,Typescript 不会在编译时给我错误,给我带来奇怪的情况。我希望响应类型为 OrderFilled 或 OrderCancelled,但 sendMessage 实际上可以解析为一个完全不相关的类型的承诺,没有任何编译错误,这会在运行时产生意外和未处理的异常。
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)
})()
使用代码 here
我是 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 returns 是另一种类型的 Promise 时,Typescript 不会在编译时给我错误,给我带来奇怪的情况。我希望响应类型为 OrderFilled 或 OrderCancelled,但 sendMessage 实际上可以解析为一个完全不相关的类型的承诺,没有任何编译错误,这会在运行时产生意外和未处理的异常。
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)
})()
使用代码 here