From 6a782906dc08721600c0cf840db9764bd7e009b9 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Thu, 9 Jul 2026 17:52:26 +0100 Subject: [PATCH] Add abstract `BaseEnvBuilder` to enforce that `clone` is overriden by subclasses --- src/testing-utils.ts | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/testing-utils.ts b/src/testing-utils.ts index 24c856cda..7a4496ec4 100644 --- a/src/testing-utils.ts +++ b/src/testing-utils.ts @@ -213,7 +213,7 @@ export function initAllState( /** * Wraps a function that accepts an `ActionState` for testing in different environments. */ -class EnvBuilder< +abstract class BaseEnvBuilder< Args extends readonly any[], R, Fs extends ReadonlyArray, @@ -224,7 +224,7 @@ class EnvBuilder< constructor( fn: (state: ActionState, ...args: Args) => R, - cloneFrom?: EnvBuilder, + cloneFrom?: BaseEnvBuilder, ) { this.fn = fn; this.logger = new RecordingLogger(); @@ -238,9 +238,7 @@ class EnvBuilder< * Creates a clone of this object. Used internally. * Must be overriden by subclasses. */ - protected clone(): this { - return new EnvBuilder(this.fn, this) as this; - } + protected abstract clone(): this; public getLogger(): RecordingLogger { return this.logger; @@ -274,17 +272,27 @@ class EnvBuilder< } } +class EnvBuilder< + Args extends readonly any[], + R, + Fs extends ReadonlyArray, +> extends BaseEnvBuilder { + protected clone(): this { + return new EnvBuilder(this.fn, this) as this; + } +} + class CallableEnvBuilder< Args extends readonly any[], R, Fs extends ReadonlyArray, -> extends EnvBuilder { +> extends BaseEnvBuilder { private args: Args; constructor( fn: (state: ActionState, ...args: Args) => R, args: Args, - cloneFrom?: EnvBuilder, + cloneFrom?: BaseEnvBuilder, ) { super(fn, cloneFrom); this.args = args;