如何实现强制调用指定方法的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
相关产品推荐
相关产品推荐

