当前位置: 首页 > 知识库问答 >
问题:

如何在TypeScript中定义单例

许阿苏
2023-03-14

在TypeScript中实现类的单例模式的最好和最方便的方法是什么?(有和没有惰性初始化)。

共有3个答案

向俊贤
2023-03-14

我发现的最好的方法是:

class SingletonClass {

    private static _instance:SingletonClass = new SingletonClass();

    private _score:number = 0;

    constructor() {
        if(SingletonClass._instance){
            throw new Error("Error: Instantiation failed: Use SingletonClass.getInstance() instead of new.");
        }
        SingletonClass._instance = this;
    }

    public static getInstance():SingletonClass
    {
        return SingletonClass._instance;
    }

    public setScore(value:number):void
    {
        this._score = value;
    }

    public getScore():number
    {
        return this._score;
    }

    public addPoints(value:number):void
    {
        this._score += value;
    }

    public removePoints(value:number):void
    {
        this._score -= value;
    }

}

以下是您如何使用它:

var scoreManager = SingletonClass.getInstance();
scoreManager.setScore(10);
scoreManager.addPoints(1);
scoreManager.removePoints(2);
console.log( scoreManager.getScore() );

https://codebelt.github.io/blog/typescript/typescript-singleton-pattern/

桓深
2023-03-14

TypeScript 中的 Singleton 类通常是反模式的。您可以改用命名空间。

class Singleton {
    /* ... lots of singleton logic ... */
    public someMethod() { ... }
}

// Using
var x = Singleton.getInstance();
x.someMethod();
export namespace Singleton {
    export function someMethod() { ... }
}
// Usage
import { SingletonInstance } from "path/to/Singleton";

SingletonInstance.someMethod();
var x = SingletonInstance; // If you need to alias it for some reason
马野
2023-03-14

从TS 2.0开始,我们有能力在构造函数上定义可见性修饰符,所以现在我们可以在TypeScript中处理单例,就像我们在其他语言中习惯的那样。

举例如下:

class MyClass
{
    private static _instance: MyClass;

    private constructor()
    {
        //...
    }

    public static get Instance()
    {
        // Do you need arguments? Make it a regular static method instead.
        return this._instance || (this._instance = new this());
    }
}

const myClassInstance = MyClass.Instance;

感谢@Drenai指出,如果您使用原始编译的javascript编写代码,您将无法防止多次实例化,因为TS的约束消失了,构造函数也不会被隐藏。

 类似资料:
  • 我想定义一个带有对象和不同类型的接口,例如 在定义上,没有问题,但在调用like后 这不起作用,并出现以下错误 错误错误:未捕获(promise中):TypeError:无法设置未定义的属性“名称”TypeError:无法设置未定义的属性“名称” 有一些相似的主题,但它们并不完全相关。(如何在类型脚本接口中定义对象或者如何在类型脚本中定义对象变量的类型?) 我很感激你帮助我找到解决办法。

  • 我刚刚用打字稿开始了一个新的反应项目,在功能组件中定义自定义道具时遇到了困难。 我查找了如何定义自定义道具,并找到了一种定义接口的方法,该接口详细描述了我传递给函数的道具类型,但是当我试图在我的主应用程序上运行它时,我得到一个错误消息 类型“{ digit: number; }”不能分配给类型“IntrinsicAttributes”。属性“数字”在类型“内部属性”上不存在。TS2322 我的代码

  • 我用global.d.ts定义全局变量: 但是在执行main.ts的时候 报错:

  • 问题内容: 如何使用TypeScript定义我的控制器。到目前为止,它在angular js中,但是我想更改为type script。以便可以快速检索数据。 问题答案: 我决定通过工作示例添加另一个答案。这是非常简单的版本,但应该显示所有的基本如何向我们 和 。 有一个工作的家伙 这将是我们扮演服务器的角色。 这将是我们的启动模块: 所以以后我们可以使用module 。这就是我们的index.ht

  • 问题内容: 我在JPA中使用实体映射存在以下问题。我有两个实体,第一个是Lookup,第二个是Text,它表示实体的翻译。现在,我需要将Lookup绑定到Text,但是我不希望Text引用Lookup。更复杂的是,Text在此关系中不使用其主键,而是在列中定义的元代码 。 因此,我尝试了这种方法(以及其他几种方法),但没有结果。我也不能在数据库中创建联接表,也不想将Lookup绑定到Text类。所

  • 关于JPA中的实体映射,我有以下问题。我有两个实体,第一个是查找,第二个是表示实体翻译的文本。现在我需要将Lookup绑定到文本,但我不希望文本引用Lookup。为了使这种情况更加复杂,文本在此关系中不使用其主键,而是使用列中定义的元码。 所以我尝试了这个(和其他一些变体),但没有结果。我也不能在数据库中创建连接表,我不想绑定查找到我的文本类。谁能告诉我有没有别的办法?