此代码使用field.type
这是一个字符串,以确定要渲染的组件。
SelectOptionsOverlay
组件将使用其CardFormSelectField
渲染type=="select"
(options
)。
CardFormTextAreaOverlay
将呈现CardFormTextAreaField
(type=="textarea"
),并且此组件将永远不会尝试使用options
或CardFormTextAreaField
中不存在的任何其他属性。
export type CardFormSelectField = {
title: string,
type: string,
placeholder: string,
options: string[]
};
export type CardFormTextAreaField = {
title: string,
type: string
};
export type CardFormField = CardFormSelectField | CardFormTextAreaField;
overlay(field: CardFormField): ?(SelectOptionsOverlay | CardFormTextAreaOverlay) {
const props = {...};
switch (field.type) {
case "select":
return <SelectOptionsOverlay {...props} />;
case "textarea":
return <CardFormTextAreaOverlay {...props} />;
}
}
switch
语句可确保一切安全。但是,Flow并不“知道” switch语句及其安全益处,因此抱怨:
Cannot return <SelectOptionsOverlay /> because:
Either React.Element [1] is incompatible with SelectOptionsOverlay [2].
Or React.Element [1] is incompatible with CardFormTextAreaOverlay [2].
[1]
是return语句,[2]
是函数的返回值的类型声明:?(SelectOptionsOverlay | CardFormTextAreaOverlay)
第二个return语句(对于CardFormTextAreaOverlay
)也存在相应的错误。
我实际上很难理解这意味着什么,更不用说是否有可能解决它了。
另一方面,据我所知,如果我删除return语句的类型注释,Flow仅会用SelectOptionsOverlay
抱怨return语句,抱怨field
道具可能如何包含{{1}中不存在的options
和placeholder
。
是的,但是switch语句应该保护我们在实际收益中免受不良道具的侵害。但是您不能打开FlowType吗?因为Flow不是真正的JS?
答案 0 :(得分:1)
如果可能并且对您的代码有意义,则可以为每个type
专门设置CardFormField
属性。例如,您可能有type: string
,而不是CardFormSelectField
的{{1}}。这样,Flow知道进入type: "select"
块时,case "select"
的类型必须为props
。当前,Flow无法将每个CardFormSelectField
语句与并集类型中的特定类型相关联。
case