Получение правильного типа объекта из контейнера - PullRequest
0 голосов
/ 27 мая 2018

У меня есть контейнер, который содержит различные службы, такие как: 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 устанавливается вручную в конструкторе (опущено).

Все службы реализуютIСервис, но не имеет общих методов.Поэтому, как только я получу сервис из контейнера, компилятор должен знать точный тип объекта, чтобы использовать сервис.Я мог бы сделать это вручную, как в add(): this.services.get('conf') as Config, но это было бы неприятно.

Как переписать get() (и, возможно, add()), чтобы вернуть объект правильного типа?* services: Map<string, IService> правильно напечатан?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...