条件对象属性上的流类型问题

时间:2019-08-21 05:26:46

标签: javascript typescript object ecmascript-6 flowtype

我遇到此流程问题string [1] is not an object,其代码如下:

type User = {
  name: string,
  age: number,
  gender?: string,
}

const user: User = {
  name: 'xxx',
  age: 23,
  ...(props.gender && { gender: props.gender })   // <----- the culprit is this line
}

你知道为什么吗?
其余对象散布运算符似乎没有正确支持有条件地设置键。

我解决了这个问题:

const user: User = {
  name: 'xxx',
  age: 23,
}
if (props.gender) {
  user.gender = props.gender
}

但是我不想根据流类型放弃语言功能。

2 个答案:

答案 0 :(得分:1)

Flow在此处的代码中捕获了合法的类型错误错误。如果gender是一个空字符串,则您的代码等于

const user: User = {
  name: 'xxx',
  age: 23,
  ...""
};

虽然不是运行时错误,但绝对是奇怪的类型错误。您应该只在对象上使用对象传播语法。

最好的解决方法是在完成后分配属性,或者执行

...(props.gender ? { gender: props.gender } : null)

明确指出“如果性别是虚假的,请勿散布任何财产”。您也可以使用{}代替null,但这只是无缘无故地创建了一个额外的对象。

答案 1 :(得分:0)

通读此Github issue on object rest spread operator后,我发现了一种更好的解决方法。默认情况下,这是一个空对象。

所以我更改了这一行:

[{'Age': '48',
  'Children': 'Josh,Beth',
  'Disability': 'no',
  'Name': 'Richard',
  'city': 'Seattle',
  'enterprenuer': 'yes'},
 {'Age': '32',
  'Children': '',
  'Name': 'Bryan',
  'Visa': 'no',
  'city': 'NY',
  'disability': 'no',
  'enterprenuer': 'no',
  'wfh': 'yes'}]

使用

...(props.gender && { gender: props.gender })

现在,流错误已解决。