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

如图。我在基类里这样写的

然后我的子类继承它之后就可以随意点出Ins()了
image

使用正常。并且一直在这样用

但是啊。我有强迫症
我不想在Ins后面加括号。

这个需要怎么处理?
我尝试吧Ins写成get方法失败了。

有没有大神指点一下。

可以看下这些

function singleton(target: any, propertyKey: string) {
const privateKey = _${propertyKey} ;

Object.defineProperty(target, propertyKey, {
    get: function () {
        if (!this[privateKey]) {
            this[privateKey] = new this();
        }
        return this[privateKey];
    },
    configurable: false,
    enumerable: false,
});

}

export class ClassTest {
@singleton
public static instance: ClassTest;

public test() {
    cc.log('ClassTest');
}

}

这样也是可以的

貌似不太行,刚试了一下,此处 configurable 为 false 的时候编译报错:Cannot redefine property: instance。修改为 true 后编译通过,使用 ClassTest.instance.test() 调用执行 test 方法时,再次报错: Cannot read properties of undefined (reading ‘test’) 。

你这个是不是需要修改tsconfig的配置项?

好像是加了
“experimentalDecorators”: true,

应该不是这个,这个是启用对装饰器语法的支持,cocos默认是有开启的,你们的target和module设置的是什么版本的?可能跟这个有关

我用的比较 新{
/* Base configuration. Do not edit this field. */
“extends”: “./temp/tsconfig.cocos.json”,

/* Add your custom configuration here. */
"compilerOptions": {
    "strict": false,
    "lib": ["es2015","ES2018", "dom"],
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true // 需要开启
}

}

刚试了一下,还是不行,看来我跟这个写法无缘,哈哈哈哈,不纠结了,还是继续用之前的方案 :grinning:


是这个意思么?
去掉括号一样很拖沓啊,看着都难受

这样操作吧,更直接

没看懂这个帖子, 是get/set没法用吗?

是继承后,inst的类型提示问题

主要是这个问题限制了继承模式

你这个确实解决了Inst的提示问题,但是每次都给创建了一个父类 :sweat_smile:

没办法,像这样的方式,不管是哪个语言,其实都是很麻烦的,毕竟涉及到了静态变量,处理方式就会更麻烦一些

是这样但是要一个基类写成通用的,子类只要继承就行了

用装饰器还是不够优雅,还得单独写个静态成员变量

试了下, 确实不好实现.
我一般是使用 用户代码片段 来写单例.

单例写法老项目用的比较多,现在早淘汰了