2

以下(简化)代码

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] 是不精确的,因此它可能包含与对象字面量 [1] 中的 ' 定义isSelected冲突的类型。isSelected尝试使Category[2] 精确。

我错过了什么?

4

1 回答 1

7

您的类别类型不准确,这意味着它可能包含未在您的类型中定义的属性。出现错误是因为如果 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-06-09T15:58:07.727 回答