Уточнение свойства объекта уточняет свойство, а не объект.
// `a.foo` is of type `?string`
// `a` is of type `{+foo: ?string}`
if (a.foo) {
// within this block, `a.foo` is of type `string` (no `?`)
// `a` is of type `{+foo: ?string}`
}
// `a.foo` is of type `?string`
// `a` is of type `{+foo: ?string}`
В этом конкретном случае я бы, вероятно, сделал бы что-то вроде этого:
if (a.foo) {
fun({ foo: a.foo });
}
( Попробуйте )
Просто потому, что это такой простой случай.В более сложном случае вы хотели бы использовать непересекающиеся союзы .
type A = {
+foo: string,
};
type B = {
+foo: void,
};
type T = A | B;
const a: T = ({ foo: undefined }: B);
const fun = (obj: A) => {
return obj
}
// `a` is of type `A | B` (which is type `T`)
if (a.foo) {
// inside this block `a` is of type `A`
fun(a);
}
// `a` is of type `A | B` (which is type `T`)
( Try )
В концедень, не существует супер прямого способа конвертировать { +foo: ?string }
в { +foo: string }
, потому что это два совершенно разных сложных типа, и они должны обрабатываться как таковые.