使用ES6 + Flow代替TypeScript

Bru*_*res 11 javascript typescript ecmascript-6 flowtype

我正在为JavaScript应用程序建模.此应用程序的主要功能是使用REST API来配置和显示具有某些自定义输入类型的表单.我正在考虑使用TypeScript来利用类型和类.但经过一些谷歌搜索,我意识到我可以用JavaScript ES6 + Flow(和Babel)达到非常相似的结果.

我的问题是:

  • 这两种方法真的很相似,或者我弄得一团糟?
  • 我应该考虑在ES6 + Flow或TypeScript之间做出明智的选择?

感谢帮助.

Nat*_*ote 24

免责声明:我在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';
Run Code Online (Sandbox Code Playgroud)

这段代码不正确 - b.x现在'asdf'即使类型说它应该是'foo'!

打字稿允许这样做.Flow抱怨混乱.

(打字稿游乐场)(试试流程)

关于工具,打字稿获胜,落实(尽管我很难说,因为主要负责将Flow整合到核素中的人).设置过程很简单,一切正常.对于Flow,您需要安装和配置Babel(因为Flow不是编译器,您需要删除类型).对于Typescript,你需要为编辑器支持做的就是下载VSCode,你就完成了 - 你甚至不需要单独下载Typescript.对于Flow,如果要使用推荐的路径,则需要安装Atom + Nuclide并单独下载Flow.设置完成后,Flow编辑器支持工作得很好,但初始设置非常耗时.

我没有使用过足够的VSCode + Typescript来准确地比较它们,但我知道很多人对它非常满意,而且基于我对它的有限经验,它非常精致.功能集也更大 - 例如,Typescript支持自动重构.

Typescript的DefinitelyTyped(一组库的类型定义,所以你可以使用npm模块,同时保留类型安全)比Flow类似的flow-typed更大更成熟 - 尽管flow-typed正在增长.

  • 很好的答案.值得一提的另一件事(来自长期使用Flow且喜欢它的TS用户)是TS有一个更大的类型定义生态系统(DefinitelyTyped).似乎几乎每个库都有高质量的TS类型定义.即使是我不指望的.获取这些类型也非常简单,甚至在某种程度上自动在VSCode中.而Flow有很多差距.但Flow的类型定义生态系统肯定正在取得进展.我希望尽快在一个真实的项目中使用Flow! (7认同)
  • 我很想知道更多关于为什么Flow会对不同于阵列的不正确突变的对象进行不正确的突变.例如,这段代码:`var x = ["100",10]; x.pop(); x.push( "富"); console.log(x [1] .toFixed());`是TypeScript中的错误,但不是Flow,它是给定示例的后面的. (2认同)