假设我有一个可以是JavaScript错误对象或空对象的变量,我如何在Flow中指定空对象?
我在各个地方尝试过的一种可能性(例如here),如下所示:
const err: Error | {||} = {};
但这会产生以下流量错误:
1: const exact: {||} = {};
^ Cannot assign object literal to `exact` because inexact object literal [1] is incompatible with exact object type [2].
References:
1: const exact: {||} = {};
^ [1]
1: const exact: {||} = {};
^ [2]
见it live here。 ||
符号显然是$Exact<>
的简写,正如here所解释的那样。所以我不明白为什么这个失败了。
它所说的是我试图分配给err
的空对象是一个“不精确的对象文字”。我知道它是一个对象文字,实际上与空对象的“确切对象类型”不匹配。
我不明白为什么它不准确。看起来非常精确,因为在运行时它是一个空对象。有人可以解释这里的逻辑和/或如何指定err
是Error
还是空对象?
答案 0 :(得分:4)
尝试使用$Shape<T>
指定没有属性的对象:
(Try)
type errOrObj = Error | $Shape<{||}>
const err: errOrObj = new Error("Blah")
const emptyObj: errOrObj = {}
const nonempty: errOrObj = {blah: 2} // Error
答案 1 :(得分:0)
尝试一下:
const err: Error | {||} = Object.freeze({});
(Try)
请参见https://github.com/facebook/flow/issues/2977#issuecomment-390613203和https://flow.org/en/docs/types/objects/#toc-unsealed-objects