【问题标题】:Cannot spread object literal because Flow cannot determine a type for object literal无法传播对象文字,因为 Flow 无法确定对象文字的类型
【发布时间】:2020-06-09 15:49:23
【问题描述】:

以下(简化)代码

type Category = {
    id: string,
    name: string,
};

type Option = {
    id: string,
    name: string,
    isSelected: boolean,
};

const options = categories.map((c: Category): Option => ({
 isSelected: true,
 ...c,
}));

产生错误:

Flow:无法传播对象文字,因为 Flow 无法确定对象文字 [1] 的类型。 Category [2] 是不精确的,因此它可能包含 isSelected,其类型与对象字面量 [1] 中的 isSelected 定义冲突。尝试使Category [2] 准确。

我错过了什么?

【问题讨论】:

    标签: javascript flow-js


    【解决方案1】:

    您的类别类型不准确,这意味着它可能包含未在您的类型中定义的属性。出现错误是因为如果 c 包含名为 isSelected 的属性,则可能导致 Option 对象没有该属性的布尔值。

    有两种可能的修复方法:

    const options = categories.map((c: Category): Option => ({
       ...c,
     isSelected: true,
    }));
    

    这将导致isSelected: true 始终优先于c.isSelected(如果它曾经存在)。

    第二个修复是使类别准确。

    type Category = {|
        id: string,
        name: string,
    |};
    

    这样做将禁止它拥有额外的属性。您应该尽可能使您的对象精确。

    更多信息可以阅读https://flow.org/en/docs/types/objects/#toc-exact-object-types

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 2022-07-23
      相关资源
      最近更新 更多