我2.4的
type SingleInstance<T extends new (...args: any) => any> = T & {
/**单利对象方法 */
Ins: (...args: ConstructorParameters<T>) => InstanceType<T>;
// __ins__?: InstanceType<T>;
};
/**
* 单利方法
* target依然可以继承,不会有影响
* 推荐用法
* const MyClass = SingleFunc(class {})
* 或者
* const MyClass = SingleFunc(class extends ParentClass {})
* 或者
* const p:InstanceType<typeof(MyClass)>=new MyClass() //这是特殊需求
* @param
* @returns
*/
export function SingleFunc<T extends ConstructorTemplateType<any>>(target: T): SingleInstance<T> {
const instanceKey = Symbol('singleton_instance')
const ctor = target as SingleInstance<T>;
// 添加静态方法 Ins
ctor.Ins = function (...args: any[]) {
if (!ctor[instanceKey]) {
ctor[instanceKey] = new target(...args);
}
return ctor[instanceKey]
} as (...args: ConstructorParameters<T>) => InstanceType<T>;
// 修改构造函数行为
// const original = ctor;
// const f: any = function (...args: any[]) {
// if (!f[instanceKey]) {
// f[instanceKey] = new original(...args);
// }
// return f[instanceKey];
// };
// f.prototype = original.prototype;
// retur
return ctor;
}
MyClass .ins() 用的时候才创建 一般是挂载在某个全局上的get方法上
,如果ts支持多继承能方便很多。