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

Javascript 条件对象属性的流类型问题,javascript,typescript,object,ecmascript-6,flowtype,Javascript,Typescript,Object,Ecmascript 6,Flowtype,我遇到了这个流问题字符串[1]不是具有以下代码的对象: 类型用户={ 名称:string, 年龄:数字,, 性别?:字符串, } 常量用户:用户={ 姓名:“xxx”, 年龄:23,, …(props.gender&&{gender:props.gender})/通过阅读本文,我找到了一个更好的解决方法。这是通过默认为空对象 所以我改变了这一行: …(props.gender&{gender:props.gender}) 与 …((props.gender&{gender:props.gend

我遇到了这个流问题
字符串[1]不是具有以下代码的对象

类型用户={
名称:string,
年龄:数字,,
性别?:字符串,
}
常量用户:用户={
姓名:“xxx”,
年龄:23,,
…(props.gender&&{gender:props.gender})/通过阅读本文,我找到了一个更好的解决方法。这是通过默认为空对象

所以我改变了这一行:

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

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

现在,流错误已解决。

流正在捕获您代码中的合法类型错误。如果
gender
为空字符串,则您的代码等于

const user: User = {
  name: 'xxx',
  age: 23,
  ...""
};
这虽然不是运行时错误,但绝对是一个奇怪的类型错误。您应该只在对象上使用对象扩展语法

这里最好的修复方法是在之后分配属性,就像您所做的那样,或者

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

这清楚地表明“如果性别是虚假的,不要传播任何属性”。你也可以使用
{}
而不是
null
,但这只是无缘无故地创建了一个额外的对象。

请包括一个完整的例子。你的代码在这里工作得很好:谢谢你的明确答案。
null
{}
;)但是,扩展语法的工作原理应该类似于
对象。赋值
,后者将所有原语处理为
{}
所以它不应该触发流类型错误。但是为了清楚起见,我同意,添加三元是一种更可读的方法。谢谢!你关于
性别
是空字符串的评论对我来说似乎不正确。如果
性别
是空字符串
它将强制为
,因此非条件扩展。@DivyanshuMaithani对象扩展使用此处指定的对象强制:因此不强制
false
。如果它是三元运算符,则将其改为三元运算符。三元运算符的推理更简单:
…((props.gender?{gender:props.gender}):{}