首页 > 解决方案 > 从容器中获取正确类型的对象

问题描述

我有一个包含各种服务的容器,例如: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>正确键入?

标签: typescriptgenericscontainers

解决方案


推荐阅读