Skip to content

Suggestion: Change CircuitBreaker type declaration #846

@jeengbe

Description

@jeengbe

I propose the following change to @types/opossum:

// From
declare class CircuitBreaker<TI extends unknown[] = unknown[], TR = unknown> extends EventEmitter { ... }

// To
declare class CircuitBreaker<T extends (...args: readonly never[]) => Promise<unknown>> extends EventEmitter { ... }

While this is the most breaking change, it makes a lot of work with the CircuitBreaker interface easier, for example:

export class CircuitBreakerThingRepository implements ThingRepository {
  private readonly circuitBreaker: CircuitBreaker<
    Parameters<ThingRepository['getThing']>,
    Awaited<ReturnType<ThingRepository['getThing']>>
  >;

  constructor(
    circuitBreakerFactory: CircuitBreakerFactory,
    delegate: ThingRepository,
  ) {
    this.circuitBreaker = circuitBreakerFactory.create(
      delegate.getThing.bind(delegate),
    );
  }

  getThing(arg: number): Promise<string> {
    return this.circuitBreaker.fire(arg);
  }
}

to

  private readonly circuitBreaker: CircuitBreaker<ThingRepository['getThing']>;

Practically, the type annotation is not required here (TS is able to infer it given the constructor assignment). Code such as:

export interface CircuitBreakerFactory {
  create<T extends (...args: readonly never[]) => unknown>(
    implementation: T,
  ): CircuitBreaker<Parameters<T>, Awaited<ReturnType<T>>>;
}

is also simpler written like:

export interface CircuitBreakerFactory {
  create<T extends (...args: readonly never[]) => Promise<unknown>>(
    implementation: T,
  ): CircuitBreaker<T>;
}

I am willing to submit a PR.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions