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