【发布时间】:2020-02-07 01:07:26
【问题描述】:
考虑这段代码:
class Base {}
class Foo<T extends Base> {
constructor(public callback: (data: T) => void) {
}
}
let map: Map<number, Foo<Base>> = new Map();
function rpcCall<T extends Base>(
callback: (data: T) => void,
): void {
map.set(0, new Foo<T>(callback));
}
它给了我这个错误:
Foo<T>类型的参数不能分配给Foo<Base>类型的参数。类型
Base不可分配给类型T。
Base可分配给T类型的约束,但T可以使用不同的约束Base子类型实例化。
我不明白为什么这不起作用。错误消息似乎是正确的,但我不明白为什么这是一个错误。我想要 T 被允许成为约束Base 的不同子类型。
另外,这确实工作:
class Base { }
class Foo<T extends Base> {
constructor(public callback: (data: T) => void) {
}
}
class Foo2<T extends Base> {
}
let map: Map<number, Foo<Base> | Foo2<Base>> = new Map();
function rpcCall<T extends Base>(
callback: (data: T) => void,
): void {
map.set(0, new Foo<T>(callback));
}
【问题讨论】:
-
你有什么计划来处理这个问题:
class BaseWithRaisins extends Base { raisins = 100; } rpcCall((x: BaseWithRaisins) => console.log(x.raisins.toFixed())); map.get(0)!.callback(new Base());?这不会引发编译时错误,但你会在运行时爆炸,因为Foo<Base>的回调必须接受 anyBase,但你给它的东西只能处理 @987654336 @. -
你可能想让
map成为Map<number, Foo<any>>,但我不知道你实际上能做什么 与它。大概您的用例在某处涉及从map中提取内容并调用回调,此时您将不知道它接受什么类型的参数。您能否提供一个更完整的用例以及您希望如何使用地图的示例代码?
标签: typescript