Skip to content

The captor function causes type errors when used with calledWith.Β #117

@vibitect

Description

@vibitect

If I try to use the captor function in a calledWith call (which accepts a Matcher) I get:

Argument of type '[CaptorMatcher<StateEntity<string, unknown>>]' is not assignable to parameter of type '[stateInstance: StateEntity<string, unknown>] | [stateInstance: StateEntity<string, unknown> | Matcher<StateEntity<string, unknown>>]'.
  Type '[CaptorMatcher<StateEntity<string, unknown>>]' is not assignable to type '[stateInstance: StateEntity<string, unknown> | Matcher<StateEntity<string, unknown>>]'.
    Type 'CaptorMatcher<StateEntity<string, unknown>>' is not assignable to type 'StateEntity<string, unknown> | Matcher<StateEntity<string, unknown>>'.
      Property 'description' is missing in type 'CaptorMatcher<StateEntity<string, unknown>>' but required in type 'Matcher<StateEntity<string, unknown>>'.ts(2345)
Matchers.d.ts(4, 22): 'description' is declared here.

To me it seems that CaptorMatcher for some reason doesn't implement description, so Typescript complains.

If I do this however:

const c = captor<StateEntity<string, unknown>>();

stateRepository.upsert
    .calledWith(c as unknown as Matcher<StateEntity<string, unknown>>) // πŸ‘ˆ this part
    .mockReturnValue(TE.right(c.value));

then it works as intended. I suggest implementing description properly. This is a working implementation:

import { Matcher } from "jest-mock-extended";

export class FixedCaptorMatcher<T> extends Matcher<T> {
    public readonly value!: T;
    public readonly values: T[] = [];

    constructor() {
        super((actualValue: T) => {
            // eslint-disable-next-line @typescript-eslint/ban-ts-comment
            // @ts-ignore
            this.value = actualValue;
            this.values.push(actualValue);
            return true;
        }, "captor");
    }

    override getExpectedType() {
        return "Object";
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions