首页 > 解决方案 > 如何使用 describe.each 为 jest 测试添加类型?

问题描述

const has = (object: Record<string, unknown>, key: string) => {
    return object != null && hasOwnProperty.call(object, key)
};

有.test.ts

describe('has', () => {
    const obj = {
        name: 'name',
        1: 1,
        false: false,
        undefined: undefined
    };
    describe.each([
        ['name', true],
        [1, true],
        [false, true],
        [undefined, true],
        ['no-such-key', false]
    ])('when key = %s', (key, expected) => {
        it(`should return ${expected}`, () => {
            expect(has(obj, key)).toBe(expected);
        });
    });
});

在此处输入图像描述

有没有人有为开玩笑测试添加类型的经验?我describe.each用来循环数据集。虽然我能够成功运行测试,但我想解决这个打字问题。有人能帮我吗?

标签: typescriptjestjs

解决方案


看来您没有最新版本的开玩笑类型,请尝试将包更新@types/jest到最新版本(它包含每个接口的类型定义)。

如果由于某些原因无法做到这一点,您始终可以使用名为declaration- merging 的打字稿功能自行“扩展”类型:

// jest.d.ts file

declare namespace jest {

  interface Each {
    // Exclusively arrays.
    <T extends any[]>(cases: ReadonlyArray<T>): (name: string, fn: (...args: T) => any, timeout?: number) => void;
    // Not arrays.
    <T>(cases: ReadonlyArray<T>): (name: string, fn: (...args: T[]) => any, timeout?: number) => void;
    (cases: ReadonlyArray<ReadonlyArray<any>>): (
        name: string,
        fn: (...args: any[]) => any,
        timeout?: number
    ) => void;
    (strings: TemplateStringsArray, ...placeholders: any[]): (
        name: string,
        fn: (arg: any) => any,
        timeout?: number
    ) => void;
  }

  interface Describe {
    each: Each
  }
}

您可能还需要指定typeRoots配置选项,以便打字稿可以选择您的自定义类型

更新: 对不起,我刚刚注意到您的问题不是没有Each界面而是类型不正确。在您的情况下,打字稿似乎无法正确推断类型,因此您可能希望明确指定泛型类型,例如:

type TestTuple = [string | number | boolean, boolean];

describe.each<TestTuple>([
  ['name', true],
  [1, true],
  [false, true],
  [undefined, true],
  ['no-such-key', false]
])('when key = %s', (a, b) => {
    // do your stuff
});

推荐阅读