Неглубокий HOC с ферментом и TypeScript - PullRequest
0 голосов
/ 16 октября 2018

У меня есть HOC для тестирования, во время мелкого монтирования я должен вызвать некоторые методы класса:

it('Should not call dispatch', () => {
        const dispatch = jest.fn()
        const WrappedComponent = someHoc(DummyComponent)
        const instance = shallow(
          <WrappedComponent
            dispatch={dispatch}
          />,
        ).instance() as WrappedComponent
        instance.someMethod()
        expect(dispatch).toHaveBeenCalledTimes(0)
})

test работает нормально, но компилятор TS выдает ошибку

 Cannot find name 'WrappedComponent'.

И этоверно, потому что WrappedComponent не является типом или классом, но если я удаляю строку

 as WrappedComponent

, TS выдает ошибку

Property 'someMethod' does not exist on type 'Component<{}, {}, any>'.

Кроме того, он не компилируется, если я изменяю этострока как

as typeof WrappedComponent

someHoc описание:

import ...

interface State {
  /*state*/
}

interface Props {
  dispatch: Dispatch<Action>
  /*props*/
}

export someHoc = <T extends {}>(
  ChildComponent: React.ComponentClass<T>,
) => {
  class Wrapper extends React.PureComponent<T & Props, State> {

    someMethod = () => {
       /*do smth*/
    }

    render() {
      return (
        <div>
          <ChildComponent {...this.props} />
        </div>
      )
    }
  }

  return Wrapper
}

Как мне набрать экземпляр HOC?Спасибо.

1 Ответ

0 голосов
/ 17 октября 2018

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

export function shallow<C extends Component, P = C['props'], S = C['state']>(node: ReactElement<P>, options?: ShallowRendererProps): ShallowWrapper<P, S, C>;
export function shallow<P>(node: ReactElement<P>, options?: ShallowRendererProps): ShallowWrapper<P, any>;
export function shallow<P, S>(node: ReactElement<P>, options?: ShallowRendererProps): ShallowWrapper<P, S>;

Скорее всего, его следует использовать как:

const instance = shallow<typeof WrappedComponent>(
  <WrappedComponent
    dispatch={dispatch}
  />,
).instance();

В настоящее время, похоже, существуют проблемы в наборах энзимов с использованием универсальногопараметры для вывода типа компонента в ShallowWrapper.

Обходной путь, обеспечивающий безопасность типов в ходе теста, заключается в утверждении типа:

const instance = shallow(
  <WrappedComponent
    dispatch={dispatch}
  />,
)
.instance() as any as InstanceType<typeof WrappedComponent>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...