【问题标题】:Describe a type for instance of template param描述模板参数实例的类型
【发布时间】: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&lt;T&gt;(service: { prototype: T }, instance: T) { _items.set(service, instance); }
  • @TitianCernicova-Dragomir 哦,谢谢)是的,看起来这应该可行 - 我会尝试的。但它对我来说也像是一个黑客。我的意思是使用 {prototype: T}。还有其他选择吗?
  • 在某些情况下,您还可以使用构造函数签名new (...a:any[]) =&gt; T。但我认为你也想使用抽象类,所以原型解决方案是唯一可以使用这些的解决方案

标签: typescript interface inversion-of-control


【解决方案1】:

我已经解决了这个问题。

const _items = new Map();

export class IoC {
    public static register<T>(service: {prototype: T}, instance: T) {
        _items.set(service, instance);
    }
    public static resolve<T>(service: {prototype: T}): T {
        return _items.get(service);
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多