【问题标题】:Are Flow Type annotations included in production code at runtime?流类型注释是否在运行时包含在生产代码中?
【发布时间】:2017-06-21 04:26:21
【问题描述】:

我有一个关于Flow 的一般性问题。

我目前使用 React 的 prop-types library 来定义组件的 prop 类型。这些检查已从生产代码中删除,因此来自外部源的数据仍有可能导致脚本崩溃。

<Foo bar={i} />

示例:假设我有一个组件 Foo,它的属性为 bar,prop 类型为 number。在我编写代码时,如果我尝试不小心将字符串传递给 Foo 的 bar 道具,我会收到通知。但是,一旦代码上线,该健全性检查就会被删除。

Flow 是否保留在生产代码中?我的意思是,继续上面的例子,如果我使用 Flow,如果有人试图将字符串传递给 Foo 的 bar 属性,Flow 会在运行时抛出错误吗?

【问题讨论】:

  • 如何在没有数据类型的情况下将外部数据导入应用程序?除非您将其标记为 any,否则 Flow 仍会要求您验证输入类型。

标签: javascript reactjs flowtype react-proptypes


【解决方案1】:

嗯,这一切都取决于您的build tools。 Flow 和 React 都不会自行删除类型注释。

React prop 类型和 Flow 之间的一个主要区别是 React prop 类型是动态,而 Flow 是 静态。这意味着 Flow 不会抛出任何运行时错误,它会静态地进行检查。

这意味着,根据设计,无论环境如何,Flow 都将从任何编译代码中删除。

这里有一个演示如何Babel compiles it

如果出于某种原因,您想从开发代码本身中删除 Flow 注释,您可以使用以下方法之一:

Babel 插件:Transform Flow Strip Types

CLI 工具:Flow Remove Types

如果您正在寻找使用 Flow 语义的动态类型检查,请查看 flow-runtime

【讨论】:

  • 我正在使用 babel 插件来删除我的 react proptypes,正如你所说。但是,即使我没有删除 proptypes,如果我将 React 的环境变量设置为“生产”,它也会跳过 proptype 检查。您最终会得到包含许多被忽略的 proptype 声明的代码。这就是为什么他们发明了那个 babel 插件,以去除基本上未使用的代码,为你节省 kb。如果您将 React 的环境设置为“生产”,react 是否会跳过流类型检查?或者他们还会继续运行吗?
  • @mrbinky3000 流程不会引发运行时错误,请查看我的编辑。
  • flow-runtime 看起来会按照我的要求进行。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多