javascript - 如何使 Typescript 中的单例跨多个模块工作?

标签 javascript node.js typescript singleton

我正在使用的 typescript 应用程序中有一个数据库类,它设置为单例,如下所示:

export default class Database {
    private static instance: Database;

    //Actual class logic removed

    public static getInstance(): Database {
        if (!Database.instance) {
            Database.instance = new Database();
            Database.instance.logger.debug("Creating new Database Instance");
        } else {
            Database.instance.logger.debug("Using existing Database Instance");
        }
        return Database.instance;
    }
}

当我使用 import databaseService from "../services/database.service"; 将模块导入另一个文件时,并使用 private database = databaseService.getInstance(); 获取实例 它按预期工作,并创建一个新实例。在同一文件中进一步尝试getInstance(),然后使用该现有对象。

但是,如果我随后在另一个文件中执行相同的操作,它将创建数据库对象的另一个新实例。这是一个禁忌,因为最终它会扰乱数据库逻辑的工作方式。

如何将单个对象设置为在整个应用程序中共享?最好不要将对象传递到各处,但如果必须如此,那就这样吧......

最佳答案

单例类是 JavaScript 中潜在的反模式,因为没有继承的类实例可以表示为普通对象。

在类构造函数中显式实现单例模式是 Node.js 和其他模块化环境中的反模式,因为模块已经提供了单例。

它可以是:

export class Database {}

export default new Database();

导出的类对于可扩展性可能很有用,但在 TypeScript 中,它对于键入来说是必需的,因为它充当接口(interface)。

关于javascript - 如何使 Typescript 中的单例跨多个模块工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55324510/

相关文章:

javascript - Koa 和 Stripe,等待渲染页面

mysql - Sequelize Model 导出一个函数

typescript - 如何将 Hooks(之前/之后)与 cucumber-js-tsflow 一起使用?

reactjs - 将 useState 与具有多个 bool 字段的对象 react

typescript - AWS CDK 部署在 CodePipeline/CodeBuild 中

javascript - TypeScript 错误对象原型(prototype)只能是对象或 null : undefined

javascript - jQuery 使用 .nextAll() 背靠背显示相邻的 XML 兄弟节点

javascript - 如何替换 html 文本区域中当前选定的文本?

node.js - 使用自定义 header 测试 NodeJS socket.io

javascript - Node.js 中用于获取推文总数的 Do/while 循环仅运行一次