【问题标题】:Can Flow recognize undeclared React props?Flow 可以识别未声明的 React 道具吗?
【发布时间】:2018-11-21 05:30:51
【问题描述】:

Flow 确保您将所需的道具传递给 React 组件,但是当您发送 extra 道具时,它似乎不会捕获错误。这允许我偶尔犯一些细微的错误,我输入了不正确的道具版本。在下面的示例中,我传入了 prop isloggedin 而不是实际的 prop isLoggedIn,但没有抛出错误,因为我有 isLoggedIn 的默认值。有什么方法可以让 Flow 识别您传入组件中未声明的 prop 的情况?

组件代码:

// @flow

import React, { Component } from "react";

type Props = {
    isLoggedIn: boolean
};

class Donkey extends Component<Props> {
  static defaultProps = {
    isLoggedIn: false,
  }

  render() {
    return (
      <div> {this.props.isLoggedIn.toString()} </div>
    )
  }
}

export default Donkey;

调用代码:

// @flow

import React, { Component } from "react";
import Donkey from "./Donkey";

type Props = {

}

class Main extends Component<Props> {
  render() {
    return (
      <Donkey isloggedin={true} />
    )
  }
}

export default Main;

流量输出:

> flow
No errors!

【问题讨论】:

  • type Props = {| ... |} 呢?
  • @Sulthan Brilliant!有什么理由不在任何地方使用这些吗? (Flow 新手,不确定最佳实践)

标签: reactjs types flowtype


【解决方案1】:

您可以使用{| ... |} 强制执行精确类型匹配(请参阅https://flow.org/en/docs/types/objects/#toc-exact-object-types)。

Flow 将报告任何缺失或额外的属性。

为什么我们不在任何地方使用它?主要是因为在许多情况下,我们并不关心是否有一些额外的属性。这可能发生在来自 JSON API 的对象,甚至是您自己的组件中,当组件只是将一些属性向下传递给它的子组件时(例如 className)。

【讨论】:

  • 您希望允许来自 JSON API 请求的额外属性是有道理的。但在实践中,您是否使用精确类型似乎并不重要,因为 Flow 的检查发生在编译时,编译器不知道将从 API 请求中收到什么。当 API 请求实际通过时,流类型注释已被剥离。我是不是想错了?
  • @rampatowl 这实际上取决于您使用的流检查类型。例如,我使用的是 flow-runtime,它在运行时检查值。
猜你喜欢
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多