Вывести тип TypeScript из присваивания после объявления - PullRequest
0 голосов
/ 05 февраля 2019

При написании тестов для компонентов React обычно инициализируется оболочка компонента (скажем, wrapper) в блоке beforeEach, а затем используется в последующих тестах.Однако, чтобы сделать это, вы должны объявить wrapper перед его присваиванием и дать ему явный тип, иначе TypeScript будет жаловаться на отсутствие типа.К сожалению, этот тип может быть довольно сложным для определения / записи.

В приведенном ниже примере есть ли способ «задержать» TypeScript, чтобы жаловаться на отсутствие типа для wrapper в примерениже и получить его, чтобы вывести тип из места, где назначено wrapper?

В качестве альтернативы, есть ли лучший шаблон для размещения переменных, который облегчает набор текста?

describe('suite', () => {
  // will trigger a no implicit any error
  // but it's quite complex to manually write out the type here
  let wrapper;

  beforeEach(() => {
    const SomeElement = complexFunctionWithGenericParams(someParam);

    // ideally, we want TS to infer the type of `wrapper` from this statement
    wrapper = mountComponent(<SomeElement />);
  })

  it('does something', () => {
    expect(wrapper.state.someField).toBe(5);
  }
}

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Нет способа вывести тип из присваивания, потому что он должен быть выведен во время объявления.Смысл локальных переменных в тестах заключается в том, что они могут использоваться между блоками, это означает, что они могут быть назначены несколько раз.Даже если бы такой вывод был возможен, он был бы неоднозначным:

let foo; // is the type supposed to be a number, or a string, or both, or any?

it('...', () => {
  foo = 1;
});

it('...', () => {
  foo = 'foo';
});

Поэтому тип должен быть указан явно, например, с помощью ReturnType:

let wrapper: ReturnType<typeof mount>;

mount isуниверсальный, тип возвращаемого значения может варьироваться, ReturnType может быть более сложным с универсальными функциями .

Поскольку фермент shallow и mount должен быть явно указан с универсальными параметрами:

wrapper = mount<typeof SomeElement, ISomeElementProps>(<SomeElement />);

Более просто указать универсальный тип напрямую, поскольку известно, какой это тип (ReactWrapper):

let wrapper: Enzyme.ReactWrapper<ISomeElementProps, ISomeElementState, typeof SomeElement>
0 голосов
/ 05 февраля 2019

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

import { shallow, mount, ReactWrapper } from 'enzyme'

describe('suite', () => {
  let wrapper: ReactWrapper;

  beforeEach(() => {
    ...
    wrapper = mount or shallow 
  })

  it('does something', () => {
    ...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...