我想在外部库定义中声明一个组件(我正在为react-bootstrap编写流类型),这样我就有了可选和必需的道具,而且没有额外的道具.我有以下内容:
declare export type AlertProps = {| bsClass: bsClass,bsStyle: ?bsStyle,onDismiss: ?(e: SyntheticEvent) => any,closeLabel: ?string,style: ?style,|} declare export class Alert extends React$Component { props: AlertProps; }
(为了这个例子,我们假设实际上需要bsStyle.)但是,如果省略bsClass,流程仍会抱怨
49: props: AlertProps; ^^^^^^^^^^ property `bsClass`. Property not found in 26: ? (<Alert bsStyle="danger" style={{ textAlign: 'center' }}> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ props of React element `Alert`. See: src/components/audit/AuditAlert.jsx:26
如果我将我的道具包裹在$Shape<>中,我就不能拥有所需的道具.我的解决方法如下:
declare export type AlertProps = { // required props go here bsClass: bsClass,} & $Shape<{| // all props (optional and required) go here bsClass: bsClass,bsStyle: bsStyle,onDismiss: (e: SyntheticEvent) => any,closeLabel: string,style: style,|}>
但是,这似乎过于苛刻!有没有更好的方法来实现我的目标?
作为旁注,this question未得到正确回答.
你可以通过放置一个指定可选的道具?在属性名称之后.例如
type Props = { optionalString?: string,maybeString: ?string,}
我可以省略optionalString,但如果我传递它,它必须是一个字符串. maybeString我必须传递,但它的值可以是null,undefined或字符串.
您可以在示例here中使用它
文档讨论了可选对象属性here.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。