diff --git a/src/index.ts b/src/index.ts index 2761c45..d8bf958 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,12 +13,13 @@ export interface BaseOptions { [key: string]: any; } -export abstract class Base extends ReadyEventEmitter { - options: BaseOptions; +export abstract class Base = BaseOptions> extends ReadyEventEmitter { + options: O; #closed = false; #localStorage: AsyncLocalStorage; - - constructor(options?: BaseOptions) { + /* just a method signature, will be implemented in subclass */ + protected _close?(): Promise; + constructor(options?: O) { super(); if (options?.initMethod) { @@ -43,7 +44,7 @@ export abstract class Base extends ReadyEventEmitter { }); }); } - this.options = options ?? {}; + this.options = options ?? ({} as O); this.#localStorage = this.options.localStorage ?? getAsyncLocalStorage(); super.on('error', err => { this._defaultErrorHandler(err); @@ -99,13 +100,12 @@ export abstract class Base extends ReadyEventEmitter { return; } this.#closed = true; - const closeMethod = Reflect.get(this, '_close') as () => Promise; - if (typeof closeMethod !== 'function') { + if (typeof this._close !== 'function') { return; } try { - await closeMethod.apply(this); + await this._close(); } catch (err) { this.emit('error', err); }