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

如何在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

  • 我有一个角度的项目,我想包括与遥测(自定义角色)的AppInsight。这个项目是用Angular和TypeScript编写的,我遵循了本教程来集成Angular项目中的用词,它似乎工作得很好。我按照这个链接添加了自定义遥测(带有角色),但它是用Java/JavaScript/node.js编写的 当我尝试使用JS代码时 我有一个错误: 当我打开用词时,有一个角色,但它没有正确设置

  • 我在项目中使用TypeScript时遇到了一个问题。我正在定义这样一个接口: 我想创建一个从该接口实现的类,但我希望该名称是私有属性,如下所示: 我得到以下错误: 类ModuleMenuItem错误地实现接口IModuleMenuItem。属性名称在类型ModuleMenuItem中是私有的,但在类型IModuleMenuItem中不是私有的。 实现接口时,如何将属性定义为私有或受保护?