Я использую 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;
}
Итак, если данные объявлены как смешанные, но мне нужно, чтобы они были пользовательского типа, как бы я это сделал?
Значения типа 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 });
}
}
};