具有常见传播模式的最新 Flow 中的“指数大量案例”错误

mur*_*yju 5 flowtype

我经常使用以下模式来创建省略null/undefined属性的对象:

const whatever = {
  something: true,
  ...(a ? { a } : null),
  ...(b ? { b } : null),
};
Run Code Online (Sandbox Code Playgroud)

从流程版本 v0.112 开始,这会导致错误消息:

由于条件 [2] 和条件 [3] 都是联合,因此计算对象字面量 [1] 可能会导致大量情况下进行推理。请为每个价差使用最多一种联合类型以简化对价差结果的推理。您可以通过指定捕获联合的所有分支的更通用的类型来摆脱联合。

在我看来,这并不是真正的类型错误,只是 Flow 试图避免一些繁重的计算。这导致我的项目中出现了数十个流程错误,我需要以某种方式解决这些错误。是否有一些优雅的方法可以为这些提供更好的类型信息?我不想修改代码的逻辑,我相信它会按照我需要的方式工作(除非有人在这里也有更优雅的解决方案)。在我诉诸// $FlowFixMe所有这些之前,先在这里询问。

Try Flow 上的完整示例

小智 1

它写起来不太优雅,我认为 Flow 应该处理您所展示的情况,但如果您仍然希望 Flow 进行类型检查,您可以尝试像这样重写它:

/* @flow */

type A = {
  cat: number,
};

type B = {
  dog: string,
}

type Built = {
  something: boolean,
  a?: A,
  b?: B,
};

function buildObj(a?: ?A, b?: ?B): Built {
  const ret: Built = {
    something: true
  };

  if(a) ret.a = a
  if(b) ret.b = b

  return ret;
}
Run Code Online (Sandbox Code Playgroud)

尝试流程