【发布时间】:2019-08-20 17:15:49
【问题描述】:
我正在编写一个Engine 类,该类在构造时获取Module 类的映射,并通过自身实例化它们。然后将创建的实例存储在modules 中。我使用泛型来确保引擎上存在的模块是已知的,并且可以被接受Engine 类型参数的函数声明为期望的。
这个Engine 类还包含地图事件处理程序,它需要一个将Engine 实例作为其第一个参数的回调。处理程序可以通过公共方法注册。
模块可能如下所示:
class Renderer extends Module<{Renderer: Renderer}> {
constructor(engine: Engine<{Renderer: Renderer}>) {
super(engine);
this.engine.addEventHandler('draw', drawSomething);
}
renderText(message: string) {
console.log(message);
}
}
...其中drawSomething,事件处理程序,看起来像这样:
function drawSomething(engine: Engine<{Renderer: Renderer}>): void {
engine.modules.Renderer.renderText('hello world');
}
你可以发现整个问题都解决了here in TypeScript playground,错误出现在第 54 行。我还用only the type definitions 创建了一个问题,以查看我想要的概念的形状。
我遇到的问题是,当我注册事件处理程序drawSomething时,在检查处理程序是否正确键入时,我传递的泛型似乎被遗忘了。假设处理程序将在没有Renderer 作为已知模块的情况下被调用。打字稿告诉我:
类型 'Engine' 不可分配给类型 'Engine'
我如何确保 TypeScript 知道当我将事件处理程序注册到具有某些模块的Engine 实例时,处理程序也将传递相同的@ 987654335@ 实例在被调用时带有那些模块?
我正在使用 TypeScript 3.5.3。
【问题讨论】:
标签: typescript typescript-generics