我一直在尝试将功能性的React组件从PropTypes转换为Flow。为该组件提供了一个对象,该对象包含要在组件内使用的字符串。
以前看起来像这样:
Component.propTypes = {
strings: PropTypes.objectOf(PropTypes.string),
}
Component.defaultProps = {
strings: {
key_one: "string one",
key_two: "string two",
}
}
我已将其转换为:
type Props = {
strings?: { [string_key: string]: string },
}
const Component = ({ strings }: Props) => (
// component using
// label={strings.key_one}
// etc
)
Component.defaultProps = {
strings: {
key_one: "string one",
key_two: "string two",
}
}
这会产生错误:
Cannot get strings.key_one because property key_one is missing in undefined [1].
[1] strings?: { [string_key: string]: string },
如果我删除[string_key: string]: ?string
,则除第一条消息外还会产生第二条错误消息:
property key_one is missing in object type [1].
如果我删除了可选标记,则错误消失了,但是我无法提供默认道具(strings?: { [string_key: string]: string },
-> strings: { [string_key: string]: string },
)。
阅读问题似乎是可能,这是由于 refinement invalidation发生了从JSX的转换,此处指出:https://github.com/facebook/flow/issues/6350。
任何人都可以提供进一步的了解,并且知道是否有解决办法吗?
答案 0 :(得分:0)
我相信我已经找到了自己问题的答案。这是不直观的。
请参见线程https://github.com/facebook/flow/issues/1660。
它看起来像:
您无需在道具类型中将...道具...设为可选。流将 如果您具有foo的默认属性,请确保foo是可选的。
测试我现有的测试似乎通过了-表示即使未标记?
,指定的默认道具仍会捕获在快照中。此方法有效,但确实减少了type Props =
本身作为文档的使用。