无法获取“ x”,因为未定义中缺少属性“ x”

时间:2018-10-31 02:48:23

标签: reactjs flowtype

我一直在尝试将功能性的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

任何人都可以提供进一步的了解,并且知道是否有解决办法吗?

1 个答案:

答案 0 :(得分:0)

我相信我已经找到了自己问题的答案。这是不直观的。

请参见线程https://github.com/facebook/flow/issues/1660

它看起来像:

  

您无需在道具类型中将...道具...设为可选。流将   如果您具有foo的默认属性,请确保foo是可选的。

测试我现有的测试似乎通过了-表示即使未标记?,指定的默认道具仍会捕获在快照中。此方法有效,但确实减少了type Props =本身作为文档的使用。