type ctor<T = {}> = new(…args:any[]) => T
export function Singleton(Base:TBase){
return class extends Base{
private static _inst:any;
static get inst(){
if(!this._inst){
this._inst = new this();
}
return this._inst
}
}
}
使用方式如下:
class AudioMgr extends Singleton(class {}) {
public foo(){
console.log(‘foo called’);
}
}
export default AudioMgr.inst as AudioMgr //禁止外部使用new进行构造。
AudioMgr.foo()
-
使用 TypeScript 的 Mixin 模式实现通用单例
-
通过构造类型约束保证类型安全
-
每个派生类各自维护独立单例实例
-
本实现中“不可构造性”并不依赖 constructor 访问控制,而是通过模块只导出实例、隐藏类构造器的方式,在类型层面彻底禁止外部 new