Свойство потока отсутствует в смешанном проходе

1

Я использую BroadcastChannel для передачи данных из одного окна браузера в другое. Однако, используя Flow, я получаю следующую ошибку: Flow: свойство 'type' отсутствует в mixed [1].

Это мой код:

const channel = new BroadcastChannel('background');
channel.onmessage = ({ data }) => {
  if (data.type === 'OK') {
    this.setState({ isLoading: false, success: true, error: false });
  }
  else if (data.type === 'ERROR') {
    this.setState({ isLoading: false, success: false, error: true });
  }
};

Я также попытался определить свой собственный тип как таковой:

type MessageType = {
  type: String,
  payload: String,
};

...

channel.onmessage = ({ data }: { data: MessageType }) => {
  if (data.type === 'OK') {
    this.setState({ isLoading: false });
  }

  if (data.type === 'ERROR') {
    alert('ERROR!');

    this.setState({ isLoading: false });
  }
};

Но затем Flow выдает мне следующую ошибку: Flow: Невозможно назначить функцию для channel.onmessage, потому что MessageType [1] несовместим со смешанным [2] в свойстве "data" первого аргумента.

Я понял, что аргумент, передаваемый обработчиком сообщений, объявляется так:

declare class MessageEvent extends Event {
  data: mixed;
  origin: string;
  lastEventId: string;
  source: WindowProxy;
}

Итак, если данные объявлены как смешанные, но мне нужно, чтобы они были пользовательского типа, как бы я это сделал?

Теги:
flowtype

1 ответ

0

Значения типа mixed могут быть абсолютно любыми, включая undefined, null или объекты без prototype.

Вам нужно явно проверить, что фактический тип data имеет поле type прежде чем вы сможете получить к нему доступ:

channel.onmessage = ({ data }) => {
  // 1. Make sure it not null
  // 2. Make sure it an object. This is only so that we can...
  // 3. ...call hasOwnProperty to make sure it has a 'type' field
  if(data != null && typeof data === 'object' && data.hasOwnProperty('type')) {
    // Inside this condition, Flow knows that the 'type' field exists
    if (data.type === 'OK') {
      this.setState({ isLoading: false, success: true, error: false });
    }
    else if (data.type === 'ERROR') {
      this.setState({ isLoading: false, success: false, error: true });
    }
  }
};
  • 0
    Сладкий! Спасибо :)
  • 0
    Есть ли какой-нибудь ярлык для этого?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню