export namespace Singleton {
const __Instance__Symbol__ = Symbol("Instance");
const __Create__Symbol__ = Symbol("Create");
export function Build<T>(...argvs: T extends (...argvs: infer R) => T ? R : any[]) {
let instance: any = null;
return function <Class>(target: new (...argvs: any[]) => Class) {
if (!target[__Create__Symbol__]) {
target[__Create__Symbol__] = () => {
return (instance = new target(...argvs));
};
}
if (!target[__Instance__Symbol__]) {
target[__Instance__Symbol__] = () => {
return instance ?? target[__Create__Symbol__]();
};
}
};
}
export function Instance<T>(type: { prototype: T }): T {
return type[__Instance__Symbol__]?.();
}
}
注册使用
@Singleton.Build() class SomeClass {}
单例调用
Singleton.Instance(SomeClass)
最近看了下公司项目前端的单例写法, 没有TS类型限制和提示
因为cocos不支持使用属性装饰器修改类成员, 因此把装饰器作用在类上.
保留了传参的需求, 也保留了删除重建的口子,参考create依葫芦画瓢即可.
给大家提供一个思路
