К сожалению, Flow не уточняет типы с помощью фильтра . Связанная проблема довольно старая, и она уже давно присутствует в дорожной карте. Как было предложено выше, вы можете привести к любому или использовать $ExpectError
для создания локально небезопасной функции. В качестве альтернативы вы можете использовать императивный подход l oop:
const res: Human[] = [];
for (thing of livingThings.things) {
if (typeof thing.name === 'string') {
res.push(thing)
}
}
return res;
Или создать полезную вспомогательную функцию mapMaybe
, которую вы можете повторно использовать во многих других случаях:
function mapMaybe<A, B>(f: A => ?B, xs: A[]): B[] {
// $ExpectError or alternatively write loop here
return xs.map(f).filter(notUndefinedOrNull);
}
mapMaybe(thing => {
if (typeof thing.name === 'string') {
return thing;
}
return null;
}, livingThings.things);