Передача объектов Generic Arguments в Flow - PullRequest
1 голос
/ 29 марта 2019

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

export type TAction<T, R> = { +type: string, payload?: T, meta?: R };

function thisWorks(action: TAction<string, boolean>) {
  const {
    payload,
    meta,
  } = action;
  // Flow knows payload is string and meta a boolean
}

function doesntWork(action: TAction<{ prop1: string, prop2: string }, boolean>) {
      const {
        payload: { prop1, prop2 },
        meta,
      } = action;
        // Flow doesn't know the type of prop1, prop2 or meta
    }

Ошибка потока:

свойство prop1 отсутствует в TAction [1] .Flow (InferError)

1 Ответ

2 голосов
/ 10 апреля 2019

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

Из этого я вижу, что проблема в том, что в TAction и мета, и полезная нагрузкапомечены как необязательные свойства .Поэтому, прежде чем разрушать полезную нагрузку, необходимо проверить, что она не undefined.Код, подобный следующему, не будет иметь ошибок потока:

export type TAction<T, R> = { +type: string, payload?: T, meta?: R };

function thisWorks(action: TAction<string, boolean>) {
  const {
    payload,
    meta,
  } = action;
  // Flow knows payload is string and meta a boolean
}

function doesntWork(action: TAction<{| prop1: string, prop2: string |}, boolean>
    ) {
      const {
        payload,
        meta,
      } = action;

      if (payload) {
        const  { prop1, prop2 } = payload;
        // Do whatever is needed
      }
    }

Попробуйте с потоком

Или, альтернативно, можно изменить аннотацию для TAction, поэтому payload и meta больше не будет необязательными свойствами, например:

export type TAction<T, R> = { +type: string, payload: T, meta: R };

function thisWorks(action: TAction<string, boolean>) {
  const {
    payload,
    meta,
  } = action;
  // Flow knows payload is string and meta a boolean
}

function doesntWork(action: TAction<{| prop1: string, prop2: string |}, boolean>
    ) {
      const {
        payload: { prop1, prop2 },
        meta,
      } = action;

        // Flow doesn't know the type of prop1, prop2 or meta
    }

Попробуйте с потоком

...