使用流过滤空对象键

时间:2018-07-01 13:12:53

标签: javascript flowtype

我有一个带有一些空键的对象,例如:

type obj = Array<{key: ?number}>;

,我想通过将空值过滤为以下内容来对此进行优化:

Array<{key: number}>

但是我不知道如何让流程变得快乐。简单复制(try flow):

type myType = {
  key: number,
}

const objs = [{key: null}, {key: 42}];

const filtered: Array<myType> = objs.filter(obj => obj.key != null);

1 个答案:

答案 0 :(得分:0)

Flow并没有(当前)说明您可以使用Array.prototype.filter按类型进行过滤的事实,因此仅假设类型没有变化。如果您真的想让Flow了解这里发生的事情,则可以始终使用简化:

Try

type myType = {
  key: number,
}

const objs = [{key: null}, {key: 42}]

// no error
const filtered: Array<myType> = objs.reduce(
  (acc, {key}) => key != null ? [...acc, {key}] : acc,
  [])

Flow可以了解key在这种情况下不能为null。如果您要保留myType的其他属性,则可以使用此reducer对其进行继承:(acc, {key, ...rest}) => key != null ? [..acc, {...rest, key}] : acc

或者,如果您确定自己在做什么(并且已经进行了单元测试或适当的测试),则可能希望通过any进行类型转换以获得相同的效果:

Try

type myType = {
  key: number,
}

const objs = [{key: null}, {key: 42}];

// no error
const filtered: Array<myType> = (objs.filter(obj => obj.key != null): any)

我个人认为类型转换更具可读性,并且很容易断言这种逻辑在一个或两个单元测试中是正确的。