在访问可空属性之前过滤掉可能的类型

时间:2016-12-09 15:42:09

标签: flowtype

鉴于以下两种类型:

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属性?

2 个答案:

答案 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