【发布时间】:2019-06-16 02:03:15
【问题描述】:
我正在尝试实现一个带有类型检查的简单 ioc 容器。
我想向“注册”方法传递一个抽象类类型和一些派生类型的实例。
在“resolve”中,我想传递一个抽象类类型并返回类型化的实例,我已经在“register 方法”中传递了。
我应该如何描述“注册”函数中“实例”参数的类型?我能够为“resolve”方法实现正确的类型检查,但是这种带有“{prototype: T}”的技术不适用于“register”方法。
const _items = new Map();
export class IoC {
public static register<K>(service: K, instance: any) {
_items.set(service, instance);
}
public static resolve<T>(service: {prototype: T}): T {
return _items.get(service);
}
}
// usage
IoC.register(AppServer, new TestAppServer());
IoC.resolve(AppServer)
【问题讨论】:
-
为什么不起作用?
-
这似乎工作正常:
public static register<T>(service: { prototype: T }, instance: T) { _items.set(service, instance); } -
@TitianCernicova-Dragomir 哦,谢谢)是的,看起来这应该可行 - 我会尝试的。但它对我来说也像是一个黑客。我的意思是使用 {prototype: T}。还有其他选择吗?
-
在某些情况下,您还可以使用构造函数签名
new (...a:any[]) => T。但我认为你也想使用抽象类,所以原型解决方案是唯一可以使用这些的解决方案
标签: typescript interface inversion-of-control