从容器中获取正确的对象类型

时间:2018-05-27 12:43:32

标签: typescript generics containers

我有一个容器,可以容纳各种服务,例如:Config,Log,Translator等。

export class Container {
    private readonly services: Map<string, IService> = new Map();

    // ...

    add (name: string) : void { 
        if (this.services.has(name)) { return; }

        const source = require(`./services/${name}/${_.startCase(name)}`) as ConstructorFunction;
        const conf = (this.services.get('conf') as Config).get('services.' + name);
        this.services.set(name, new source(conf));
    }

    get (name: string) : ??? {
        if (! this.services.has(name)) { this.add(name); }
        return this.services.get(name);
    }
}

interface IService {
    readonly handle: string;
    readonly dependencies: string[];
    readonly tags: string[];
}

type ConstructorFunction = new (...args: any[]) => {};

在构造函数中手动设置Config(省略)。

所有服务都实现了IService,但没有共同的方法。因此,一旦我从容器中获取服务,编译器就需要知道要使用服务的确切对象类型。我可以手动执行此操作,例如add()this.services.get('conf') as Config,但这会令人讨厌。

如何重写get()(以及可能add())以返回正确类型的对象? services: Map<string, IService>是否正确输入了?

0 个答案:

没有答案