Typescript и Jest: насмешка вызывает typerror, потому что она использует неправильную перегрузку - PullRequest
0 голосов
/ 18 января 2020

С учетом следующего в тесте Jest.

const mockDirListing: string[] = ['sdafd', 'sfdf'];
const mockReaddirSync = jest.spyOn(fs, 'readdirSync');
mockReaddirSync.mockReturnValue(mockDirListing);

В TypeScript будет отображаться следующая ошибка:

Argument of type 'string[]' is not assignable to parameter of type 'Dirent[]'.
Type 'string' is not assignable to type 'Dirent'.ts(2345)

Имитируемый экземпляр имеет тип

jest.SpyInstance<fs.Dirent[], [fs.PathLike, {
    encoding?: string;
    withFileTypes: true;
}]>

Но перегрузка, которую я хотел бы использовать в SpyInstance,

jest.SpyInstance<string[], [fs.PathLike, {
    encoding?: string;
    withFileTypes: true;
}]>

Кто-нибудь сталкивался с этим раньше?

То же самое можно сказать о любых классах с перегрузками

class Testing {
        foo(a: string): string;
        foo(a: number): string;
        foo(a: number | string): string {
            if (typeof a === 'string') return a;
            else if (a) return arguments.toString();
        }
    }

    test('testing', () => {
        const testing = new Testing();
        const mocked = jest.spyOn(testing, 'foo');
        mocked.mockImplementation((a: string) => a.toString());
    });

throws

Argument of type '(a: string) => string' is not assignable to parameter of type '(a: number) => string'.
  Types of parameters 'a' and 'a' are incompatible.
    Type 'number' is not assignable to type 'string'.ts(2345)

Как использовать сигнатуру типа первой перегрузки?

1 Ответ

0 голосов
/ 19 января 2020

После того как мы разберемся с этим, кажется, что лучшее, что вы действительно можете сделать, это что-то вроде

const stub = (sinon.stub(fs, 'readdir') as unknown) as sinon.SinonStub<any[], Promise<Dirent[]>>;

Приведение типа к тому, который вы укажете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...