You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现强制调用指定方法的TypeScript单例或普通实例?

单例模式实现

通过闭包封装单例实例与配置状态,对外仅暴露instance()方法获取实例,所有核心业务方法执行前都会校验配置状态:

const logger = (() => {
  let instance = null;
  let isConfigured = false;

  class Logger {
    configure(options) {
      this.logsEnabled = options.logs;
      isConfigured = true;
    }

    log(message) {
      this._checkConfigured();
      this.logsEnabled && console.log(message);
    }

    error(message) {
      this._checkConfigured();
      this.logsEnabled && console.error(message);
    }

    _checkConfigured() {
      if (!isConfigured) {
        throw new Error('Logger 未完成配置,请先调用 configure 方法');
      }
    }
  }

  return {
    instance: () => instance || (instance = new Logger())
  };
})();

// 正确使用示例
logger.instance().configure({ logs: true });
logger.instance().log('单例模式测试日志');

// 未配置调用会抛出错误
// logger.instance().error('未配置调用');
普通实例模式实现

直接在类内部维护配置状态,实例化后必须调用configure才能触发核心方法:

class Logger {
  constructor() {
    this.isConfigured = false;
  }

  configure(options) {
    this.logsEnabled = options.logs;
    this.isConfigured = true;
  }

  log(message) {
    this._checkConfigured();
    this.logsEnabled && console.log(message);
  }

  error(message) {
    this._checkConfigured();
    this.logsEnabled && console.error(message);
  }

  _checkConfigured() {
    if (!this.isConfigured) {
      throw new Error('Logger 未完成配置,请先调用 configure 方法');
    }
  }
}

// 正确使用示例
const logger = new Logger();
logger.configure({ logs: true });
logger.log('普通实例测试日志');

// 未配置调用会抛出错误
// const unconfiguredLogger = new Logger();
// unconfiguredLogger.error('未配置调用');

核心思路

两种实现的核心都是通过一个布尔标记跟踪配置状态,在所有对外提供的业务方法(如log、error)执行前,先调用校验方法检查配置状态,未配置则直接抛出错误;configure方法负责初始化配置并将标记置为已完成状态。

内容的提问来源于stack exchange,提问作者xWiZeRx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:09:30