Typescript - макет интерфейса с отображенными типами - PullRequest
0 голосов
/ 07 мая 2018

В целях тестирования я хотел бы иметь возможность создавать объект, реализующий интерфейс, только с той функцией, которая необходима для моего теста, без необходимости вручную поддерживать фиктивный объект со всеми возможными свойствами. Обычно я использую одну функцию за раз, поэтому не нужно определять все остальные, но я не хочу, чтобы TS продолжал жаловаться на отсутствующие свойства.

Например, у меня есть интерфейс IFoo:

interface IFoo {
    myFunc(): string;
    otherFunc(): number;
}

Я попытался создать сопоставленный тип, который присваивает jest.Mock<{}> всем свойствам IFoo

type Mockify<T> = {
    [P in keyof T]: jest.Mock<{}>
};

Называя это так:

const mockFoo: Mockify<IFoo> = {
    otherFunc: {
        // Mocked function behavior
    }
}

Проблема этого подхода заключается в том, что TS жалуется на отсутствующее свойство myFunc объекта, переданного в Mockify.

Я также пытался Mockify<Partial<IFoo>> игнорировать пропущенные свойства, но тогда мое определение типа отличается от IFoo, и некоторые другие функции, зависящие от IFoo, жалуются. Я мог бы также определить все свойства как опциональные, но концептуально мне это не нравится.

У меня такое чувство, что сопоставленные типы могут выполнять работу, но, возможно, у меня нет правильного подхода.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 07 мая 2018

Я могу сделать все свойства необязательными в определении моего сопоставленного типа:

type Mockify<T> = {
    [P in keyof T]?: jest.Mock<{}>
};

Это эквивалентно использованию Partial каждый раз, когда я использую Mockify.

Затем, когда использую мойпозже смоделированный объект, утверждение типа возвращает его к исходному интерфейсу, и все счастливы

const mockFoo: Mockify<IFoo> = {
    otherFunc: {
        // Mocked function behavior
    }
} 

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