使用 ES6 + Flow 代替 TypeScript
Use of ES6 + Flow instead of TypeScript
我正在为 JavaScript 应用建模。此应用程序的主要功能是使用 REST API 来配置和显示具有某些自定义输入类型的表单。我正在考虑使用 TypeScript to take advantage of types and classes. But after some Google searches I realized that I can reach a very similar result with JavaScript ES6 + Flow (and Babel 也许)。
我的问题是:
- 这两种方法真的很相似还是我搞砸了?
- 我应该考虑什么才能在 ES6 + Flow 或 TypeScript 之间做出正确的决定?
感谢您的帮助。
免责声明:我在 Flow 团队工作。
总的来说,我认为Flow更注重稳健性,而Typescript更注重易用性。因此,Flow 将禁止可能导致运行时错误的事情,而 Typescript 在某些情况下决定在实践中,某些行为不太可能导致错误,并且防止不太可能的错误不值得给开发人员带来不便。
这是一个具体的例子:
type Foo = {
x: string;
}
type Bar = {
x: 'foo';
}
const b: Bar = { x: 'foo' };
const f: Foo = b;
f.x = 'asdf';
此代码不正确 -- b.x
现在是 'asdf'
,尽管类型表明它应该是 'foo'
!
Typescript 允许这样做。 Flow 抱怨一个令人困惑的错误。
(typescript playground) (try flow)
关于工具,Typescript 胜出,毫无疑问(作为主要负责将 Flow 集成到 Nuclide 中的人,我很难说)。设置过程很简单,一切正常。对于 Flow,你需要安装和配置 Babel(因为 Flow 不是编译器,你需要一些东西来去除类型)。对于 Typescript,您需要为编辑器支持做的就是下载 VSCode 就大功告成了——您甚至不需要单独下载 Typescript。对于Flow,如果要走推荐路线,需要安装Atom+Nuclide,单独下载Flow。设置完成后,Flow 编辑器支持运行良好,但初始设置非常耗时。
我还没有充分使用 VSCode+Typescript 来准确比较它们,但我知道很多人对它非常满意,并且根据我有限的经验,它非常抛光。功能集也更大——例如,Typescript 支持自动重构。
Typescript 的 DefinitelyTyped(一组库的类型定义,因此您可以在使用 npm 模块的同时保持类型安全)比 Flow 的类似流类型更大更成熟——尽管流类型正在增长。
静态类型系统帮助
我是静态类型语言的忠实粉丝,尤其是 Haskell。我已经涉足 TypeScript 和 Flow。静态类型技术的吸引力在于在编译器(或类似的东西)的帮助下构建更好的代码。借助改进的验证工具,我可以理清思路,从而获得更复杂、更不言而喻的设计。这是一种代码质量,在重构和维护时也会得到回报。这就是好处。
成本是选择与众不同的地方最
在这个选择中,成本是决定性因素,因为这是 Flow 和 TypeScript 之间最大的区别所在。 Haskell 的强大之处在于能够 推断 类型。虽然使用类型签名注释函数定义是最佳做法,但这不是必需的。
此外,这是关键,我在编写代码时最依赖类型推理引擎,即在尝试找出 [=32] 的最佳方法时=]design 类型签名。一旦我有了代码"that types",我实际上就不需要静态类型的容量了……工作完成了,根据编译器编译器通过剥离所有类型信息所做的工作。
在我最需要静态类型信息的时候,无法推断 类型是我使用 TypeScript 遇到的最大问题。当我最需要字体容量时,我可能会不经意地犯错误,而没有任何关于如何在我最需要它时解决它的指导。此外,由于没有让编译器推断信息的选项,我增加了工作量,以我知道不必要的方式增加了问题的复杂性。这就是推理引擎的关键所在;它减少了用户必须是明确的。它在设计我的代码时启用了线性过程(因果关系)。
妙语
好处的来源定义明确(类型帮助)。多少收益可能取决于项目。根据我的经验,有更多项目的收益超过使用 Flow 的静态类型方法的成本。
关于Flow的设置,我已经在使用transpiler,发现额外的配置要求是名义上的。这种配置方法的好处是能够在项目中仅在您认为最需要类型驱动 "guidance" 的地方逐步使用该技术, 和 。
最后,我没有提到使用 Flow 的语法优势。这已经够糟糕的了,我不得不跟踪各种 JS 风格(所有好的变化),使用 Flow 我避免了我认为与 JS for TypeScript 有很大不同的地方。
- 乙
我正在为 JavaScript 应用建模。此应用程序的主要功能是使用 REST API 来配置和显示具有某些自定义输入类型的表单。我正在考虑使用 TypeScript to take advantage of types and classes. But after some Google searches I realized that I can reach a very similar result with JavaScript ES6 + Flow (and Babel 也许)。
我的问题是:
- 这两种方法真的很相似还是我搞砸了?
- 我应该考虑什么才能在 ES6 + Flow 或 TypeScript 之间做出正确的决定?
感谢您的帮助。
免责声明:我在 Flow 团队工作。
总的来说,我认为Flow更注重稳健性,而Typescript更注重易用性。因此,Flow 将禁止可能导致运行时错误的事情,而 Typescript 在某些情况下决定在实践中,某些行为不太可能导致错误,并且防止不太可能的错误不值得给开发人员带来不便。
这是一个具体的例子:
type Foo = {
x: string;
}
type Bar = {
x: 'foo';
}
const b: Bar = { x: 'foo' };
const f: Foo = b;
f.x = 'asdf';
此代码不正确 -- b.x
现在是 'asdf'
,尽管类型表明它应该是 'foo'
!
Typescript 允许这样做。 Flow 抱怨一个令人困惑的错误。
(typescript playground) (try flow)
关于工具,Typescript 胜出,毫无疑问(作为主要负责将 Flow 集成到 Nuclide 中的人,我很难说)。设置过程很简单,一切正常。对于 Flow,你需要安装和配置 Babel(因为 Flow 不是编译器,你需要一些东西来去除类型)。对于 Typescript,您需要为编辑器支持做的就是下载 VSCode 就大功告成了——您甚至不需要单独下载 Typescript。对于Flow,如果要走推荐路线,需要安装Atom+Nuclide,单独下载Flow。设置完成后,Flow 编辑器支持运行良好,但初始设置非常耗时。
我还没有充分使用 VSCode+Typescript 来准确比较它们,但我知道很多人对它非常满意,并且根据我有限的经验,它非常抛光。功能集也更大——例如,Typescript 支持自动重构。
Typescript 的 DefinitelyTyped(一组库的类型定义,因此您可以在使用 npm 模块的同时保持类型安全)比 Flow 的类似流类型更大更成熟——尽管流类型正在增长。
静态类型系统帮助
我是静态类型语言的忠实粉丝,尤其是 Haskell。我已经涉足 TypeScript 和 Flow。静态类型技术的吸引力在于在编译器(或类似的东西)的帮助下构建更好的代码。借助改进的验证工具,我可以理清思路,从而获得更复杂、更不言而喻的设计。这是一种代码质量,在重构和维护时也会得到回报。这就是好处。
成本是选择与众不同的地方最
在这个选择中,成本是决定性因素,因为这是 Flow 和 TypeScript 之间最大的区别所在。 Haskell 的强大之处在于能够 推断 类型。虽然使用类型签名注释函数定义是最佳做法,但这不是必需的。
此外,这是关键,我在编写代码时最依赖类型推理引擎,即在尝试找出 [=32] 的最佳方法时=]design 类型签名。一旦我有了代码"that types",我实际上就不需要静态类型的容量了……工作完成了,根据编译器编译器通过剥离所有类型信息所做的工作。
在我最需要静态类型信息的时候,无法推断 类型是我使用 TypeScript 遇到的最大问题。当我最需要字体容量时,我可能会不经意地犯错误,而没有任何关于如何在我最需要它时解决它的指导。此外,由于没有让编译器推断信息的选项,我增加了工作量,以我知道不必要的方式增加了问题的复杂性。这就是推理引擎的关键所在;它减少了用户必须是明确的。它在设计我的代码时启用了线性过程(因果关系)。
妙语
好处的来源定义明确(类型帮助)。多少收益可能取决于项目。根据我的经验,有更多项目的收益超过使用 Flow 的静态类型方法的成本。
关于Flow的设置,我已经在使用transpiler,发现额外的配置要求是名义上的。这种配置方法的好处是能够在项目中仅在您认为最需要类型驱动 "guidance" 的地方逐步使用该技术, 和 。
最后,我没有提到使用 Flow 的语法优势。这已经够糟糕的了,我不得不跟踪各种 JS 风格(所有好的变化),使用 Flow 我避免了我认为与 JS for TypeScript 有很大不同的地方。
- 乙