我经常使用以下模式来创建省略了null
/ undefined
属性的对象:
const whatever = {
something: true,
...(a ? { a } : null),
...(b ? { b } : null),
};
从v0.112版本开始,将导致错误消息:
计算对象字面量[1]可能导致大量的情况要推理,因为条件[2]和条件[3]都是联合。请为每个点差最多使用一种联合类型,以简化关于点差结果的推理。您可以通过指定一个更通用的类型来捕获并集的所有分支来摆脱并集。
在我看来,这实际上不是类型错误,只是Flow试图避免进行更重的计算。这导致我的项目中出现数十个流程错误,我需要以某种方式解决。有一些优雅的方法可以为这些方法提供更好的类型信息吗?我宁愿不要修改代码的逻辑,我相信它会按我需要的方式工作(除非有人在这里也有一个更优雅的解决方案)。在我诉诸// $FlowFixMe
进行所有这些操作之前,请先在这里问。
编写起来不太优雅,我认为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;
}