我经常使用以下模式来创建省略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所有这些之前,先在这里询问。
小智 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)