8

假设我有一个变量可以是 JavaScript 错误对象或空对象,我将如何在 Flow 中指定空对象?

我在各个地方(例如此处)尝试过的一种可能性如下所示:

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]

看到它住在这里||符号显然是这里$Exact<>解释的简写。所以我不明白为什么这会失败。

它的意思是我试图分配的空对象err是一个“不精确的对象文字”。我知道它是一个对象文字,实际上与空对象的“确切对象类型”不匹配。

我不明白为什么它不准确。看起来很准确,在运行时它是一个空对象。有人可以解释这里的逻辑和/或如何指定它err是一个Error对象还是一个空对象?

4

2 回答 2

6

尝试使用$Shape<T>来指定一个没有属性的对象:

试试

type errOrObj = Error | $Shape<{||}>

const err: errOrObj = new Error("Blah")

const emptyObj: errOrObj = {}

const nonempty: errOrObj = {blah: 2} // Error
于 2018-05-31T17:37:20.787 回答
4

尝试这个:

const err: Error | {||} = Object.freeze({});

试试

请参阅https://github.com/facebook/flow/issues/2977#issuecomment-390613203https://flow.org/en/docs/types/objects/#toc-unsealed-objects

于 2019-06-18T15:08:57.340 回答