typescript - 从容器中获取正确类型的对象
问题描述
我有一个包含各种服务的容器,例如: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>
正确键入?
解决方案
推荐阅读
- python - Pandas - 用日期范围填充数据框
- three.js - 在three.js中为汽车添加前灯
- javascript - 在上下文中调用 React Hook
- python - 如何识别文本并将其发送到 iframe 中的元素?
- javascript - 如何使用 react-phone-number-input 插入数据?,插入电话号码时出现验证错误
- python - 迭代列表和更新字典以改进相应的匹配逻辑
- javascript - JSX 不呈现空白
- python-3.x - Python strip() 删除多余的(不需要的)字符
- android - 改造响应体在 android 应用程序中无法正确解析
- c++ - 编译标准库类型