Flow требует необязательных параметров при приведении типов
Имеется следующий код с использованием flow
function foo(x: type2): any {}
type type1 = {
a: boolean
}
type type2 = {
a: boolean,
b?: string
}
let obj: type1 = {
a: true
}
foo(obj);
В данном случае, flow падает с ошибкой
Cannot call 'foo' with 'obj' bound to 'x' because property 'b' is missing in 'type1' [1] but exists in 'type2' [2]. [prop-missing]
Почему такое происходит, ведь в данном случае параметр b необязательный и не должен требоваться при проверке типов?
Ответы (1 шт):
Дело в том, что в type2 требуется, чтобы поля e либо не было совсем, либо оно имело тип string, а type1 не содержит это поле, а значит не накладывает на него никаких ограничений, поэтому следующий код допустим:
let obj: type1 = {
a: true,
e: 9999,
}
Очевидно, что такой объект не совместим с type2, а значит и type1 в общем случае не совместим с type2.
Я ожидал, что это можно исправить, сделав type1 точным
type type1 = {|
a: boolean,
|}
но так почему-то тоже не работает. Зато работает такое изменение:
type type1 = {
a: boolean,
e?: void,
}
Кстати, если речь идёт о литеральном объекте, то можно просто убрать указание типа:
let obj = {
a: true,
}
и всё заработает.