问一个TS的基础问题(单例模式基类)

啊?现在都用什么形式?

如果你没有在构造内初始化,可以直接用 export default new class()

1赞

这个操作不错

我是这样的:
image
image
装饰器避免重复代码,类型声明解决提示。
主要是静态get不能使用泛型,就绕不出来了

弄成全局变量就行了,类似2.x的cc,不需要import任何文件都可以访问

噢噢~学习了

这种工具类可以,但是我还有一些manager是需要在cocos里自己挂载的。挂载完成再吧自己的instance加上实体。

最后还是用括号吧~虽然我觉得括号不够优雅。。。

export const httpctrl = new HttpCtrl(); 然后用就httpctrl.xxx 也是单例

1赞

感觉是设计问题。
不该用模板类

可以试试泛型单例

是这样的,基类:

export default class Singleton {

    private static _instance: any = null;
    static GetInstance<T>(): T {
      if (this._instance === null) {
        this._instance = new this();
      }
      return this._instance;
    }
  
    protected constructor() {}
  }

继承

@ccclass('SnakeDataManager')
export class SnakeDataManager extends Singleton {
    static get Instance() {
        return super.GetInstance<SnakeDataManager>();
    }
    hello(){
       console.log("你好");
    }
}

调用

SnakeDataManager.Instance.hello();

刚好上周我也纠结这个扩号,之前找了第一种,函数式创建类单例,觉得代码有点多余,偶然在一个帧同步项目发现别人写的,这应该是比较少的代码行数了。

2赞

最简单 直接用VSCode的代码片段

为何不这样,外面就不用加了

1赞

class Test {

}

export const test = new Test();

:+1::+1::+1:

export default class XXUtils{
//将XXUtis类设置成单例类
constructor(){return XXUtils[‘instance’] ??= this;}
}
//将XXUtils类的唯一单例添加到全局变量
window[‘xx’[ = new XXUtils();
————————————————————————
//在asset同级目录新建一个XXUtils.d.ts文件,类似cc.d.ts
declare global{
//告诉所有文件,有xx这个全局变量
const xx:XXUtils;
age:number = 5;
jump(){
console.log(‘jump!!’);
}
}
————————————————————————
这样任何文件直接xx.age或xx.jump来调用XXUtils里的变量或函数就行了无需import,类似2.x的cc

看了这么多单例,终于看到个语法是对的,代码量少的了。
GetInstance<T> 改成 GetInstance<T extends Singleton> 完美

这个虽然还要在子类写东西。但是确实用的时候优雅了~优雅~绝对的优雅

你这个虽然还要确定不是反串吗 所以为什么不直接用用户代码片段呢 我觉得都不如new一个实例再export来的优雅

另外 这个浏览量下只有这么点回复 大家肯定不是进来找所谓的优雅的单例 而是来吃茴香豆的居多吧 :rofl:奇怪怎么吃不腻 :rofl: