我有一个容器,可以容纳各种服务,例如: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>
是否正确输入了?