javascript - React——使用 TypeScript vs Flow vs?

标签 javascript reactjs typescript babeljs flowtype

我目前正在学习 React,我想我已经很好地理解它了。但是,在开发健壮的 React 应用程序方面,有一件事一直困扰着我——开发人员使用哪些工具进行静态类型检查?

我真的很喜欢 TypeScript。我认为它大大减少了开发 JavaScript 应用程序的痛苦,这要归功于类型检查和其他简洁的功能。 Visual Studio Code 还提供了非常好的代码完成功能。我知道我可以通过使用 typings 让它与 React 一起工作+ DenifitelyTyped .

问题是,关于使用 React + TypeScript 的教程并不多。似乎也没有很多关于使用此组合进行开发的文章。另一方面,很多人似乎都在使用 Flow ,这是一个由 Facebook 支持的项目(我猜他们也使用它)。

我设法找到了 discussion on Reddit关于采用 React + TypeScript/React + Flow 方式的优缺点。然而,对我来说,它似乎已经过时了,因为它现在已经有 10 个月大了。我认为从那以后发生了很多变化。

我还找到了两篇关于使用 React + Flow 的文章和 React + TypeScript .作者陈述了他在使用这两个选项时遇到的一些问题,并得出结论认为 TypeScript 是“目前最好的选择”(2015 年 11 月),尤其是因为 Flow 项目有很多问题并且从 Facebook 获得的开发人员事件很少。他还提到它不能很好地与 Babel 配合使用?

所以,我想问题是:使用 React + TypeScript 组合是否安全,或者我会遇到一些困难吗?流量呢?我应该检查其他一些类似的工具吗?您会推荐哪种方法?

2017 年 9 月更新:

有一年多日常使用 TypeScript 的经验,并使用 Flow 一段时间,我得出以下结论:

  • 时至今日,TypeScript 仍然难以使用。问题是 JavaScript 世界发展得太快了,以至于 TypeScript 一直落后。考虑使用新的 ES7 stage 3 功能?不,你不能。希望获得某些库最新版本的类型提示?等一两个月,也许更久...
  • Flow 已经走了很长一段路,改进了很多,它可以捕捉到一些 TS 捕捉不到的东西。最重要的是,它终于可以在 Windows 上运行了。此外,还有一个很棒的 VS Code 插件(不知道为什么它只有 3/5 评级)。它 100% 与 React Native 一起工作,TypeScript 甚至还不到 50%。
  • 大多数时候,您根本不需要类型。所有额外的输入很少是值得的。 JS 是一种动态类型的语言,克服它 :)

TL;DR:如果您打算使用任何类型检查器,我建议使用 Flow。

2019 年 2 月更新:

我认为上面的建议已经过时并且不再相关。三个原因:

因此,我认为 TypeScript 在 2019 年是一个比 Flow 更务实的选择。

至于是否值得使用任何类型检查器,我认为这取决于项目规模。小型项目可能不需要它。

最佳答案

我要开始这个回答说我从未使用过 Flow,所以我不能说太多。但是,我们在工作中使用 React 和 TypeScript,效果很好。

我们拥有我想您已经知道的所有好处,例如重构、类型安全、自动完成等。

当然,就我所见,Flow 语法比 TypeScript 更清晰,但您可以使用 TypeScript 逐步添加您的类型。我认为,这更多是品味问题。有些人更喜欢显式输入代码,而另一些人更喜欢输入更少并具有更强的类型推断。

关于,我认为 TypeScript 是安全的技术,Microsoft 正在插入这种语言 ( there will be a version 2 soon ),Angular 也在使用它,并且有很多 Angular 开发人员。即使在 SO 上,TypeScript 标签也有超过 4000 名关注者,而且很少有未回答的问题。

TypeScript 的大问题,至少对我们来说是,有时我们决定使用没有类型定义的组件或库,因此我们必须自己创建它们。但我想,这是回馈社区的一种方式。

关于javascript - React——使用 TypeScript vs Flow vs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36872248/

相关文章:

javascript - 如何将 JSON 转换为索引数组

javascript - React 在 prop 更新时重新渲染组件

javascript - $ ('input' ).tagsinput ('removeAll' );创建新的搜索框

javascript - Node.JS 错误 - process.env.NODE_TLS_REJECT_UNAUTHORIZED。这是什么意思?

javascript - Angular ui 路由器重定向不起作用

Angular (4, 5, 6, 7) - ngIf 上滑入滑出动画的简单示例

json - Typescript 中的 CSV 到 JSON

javascript - React.js Material UI - 带弹性显示的 CardActionArea - 子元素不使用全宽度

javascript - React Bootstrap 工具提示抛出错误 'React.Children.only expected to receive a single React element child.'

typescript - 使用索引访问时如何避免 TS2322 "Type any is not assignable to type never"