鉴于以下两种类型:
type Point = [
number,
number,
];
type Some = {
a: Point,
b: ?Point,
};
数据集:
const somes: Array<Some> = [
{a: [0, 1], b: [0, 2]},
{a: [2, 3], b: null}
]
如果我们尝试访问somes[n].b.x
,假设b是一个类型,并且可能是null或未定义,则流将自动失败。
但我们可以放心地过滤掉somes
中的所有项目,以排除任何不包含b
的项目:
const withB = somes.filter(s => !!s.b)
然而,当访问withB
中的项目时,flowtype仍会抱怨,因为它没有取消排除:
console.log( withB.map(s => s.b[0]).join(',') )
// console.log(withB.map(s => s.b[0]).join(','))
// ^^^^^^ access of computed property/element. // Computed property/element cannot be accessed on possibly undefined value
// console.log(withB.map(s => s.b[0]).join(','))
// ^^^ undefined
是否有可能以某种方式注释或提示流动,withB
中的所有项目现在都保证包含b
属性?
答案 0 :(得分:3)
如果您愿意为额外的计算付费,则另一种选择
const withB = somes
.map(x => x.b ? { a: x.a, b: x.b } : null)
.filter(Boolean)
答案 1 :(得分:1)
以下是提示Flow的一般方法:
const withB: Array<{ a: Point, b: Point }> = (somes.filter(s => !!s.b): any)
但是,在你的情况下,它不会安全。您有一组可变对象,属性'b'
可以随时设置为null
。