例如有一个类:
class Widget {}
我希望这个类的使用方不直接将其实例化,而是由框架统一实例化,使用方通过一个代理来访问由框架提供的实例:
// Widget 代理
class WidgetProxy<W extends Widget>{
private widgetInstance!: W;
// 这里的 ClassWidget 是类本身,例如直接传入 Widget,而不是类的实例 new Widget();
constructor(ClassWidget: any/*ClassItSelf<W>*/){
// 这里简化了实例化的步骤,实际使用中这个实例化过程是在框架里面完成
// @ts-ignore
this.widgetInstance = new ClassWidget() as W;
}
public getWidgetInstance():W{
return this.widgetInstance;
}
}
// 使用方
class UserInterface {
private widgetProxy = new WidgetProxy<Widget>(Widget);
public testIfWidgetReady(){
return this.widgetProxy.getWidgetInstance();
}
}
参照 TS 提供的 lib.es5.d.ts
中ConstructorParameter
的实现,我实现了如下 ClassItSelf
:
type ClassItSelf<T> = new (...args: any[]) => T;
将ClassItSelf<W>
作为WidgetProxy
构造函数的参数类型,可以做到不报错,但是会丢失Widget
的构造函数的参数类型和 Widget
的静态属性。
既然使用者可以扩展
Widget
,那你实例化对象就无法“手动完成”,即使你知道构造函数参数列表。这种情况应该引入di
来解决,让使用者去“配置”关联关系,框架层面通过关系再做组合,最终构造扩展后的Widget
。一个玩具供参考 https://github.com/unicreator...