(脸谱)流程 - 类型注释如何工作

时间:2016-09-26 13:50:33

标签: javascript typescript annotations flowtype

Facebook的Flow支持type annotations。 Specyfing类型是JavaScript中不可用的东西(由于它的弱类型性质,可能永远不会出现) - 它是TypeScript语言的一个主要特性。

我的问题是 - 如何在JavaScript代码中使用Flow的类型注释,知道JS不支持类型注释 - 它只是语言之外的东西。

我的评论:当然,我可以使用JS的另一个预处理器来删除注释(无论是在grunt,gulp,webpack还是其他任何方面),但这是一个额外的步骤,使自动化更加昂贵。对我来说,这似乎是非常糟糕的设计,所以我想可能有更好的解释/解决方案。

此外,类型注释是TypeScript功能。由于流支持它,这是否意味着Flow的目标不仅是JavaScrpt,还有TypeScript?如果是这样,那么我为什么要使用flow而不是TypeScript?

2 个答案:

答案 0 :(得分:1)

你有很多选择。

类型注释

在Flow或TypeScript中,您可以使用类型注释或使用注释。如果您不在TypeScript中使用类型注释,则可以使用--allowJs标志并按照惯例在JS Doc注释中编写类型:

AllowJS with TypeScript

如果您使用的是句法类型注释(例如a: string),则需要使用Babel或TypeScript删除它们。

ES6功能

如果您正在使用类,导入,箭头功能等ES6 +功能,并希望定位与ES5兼容的浏览器,则需要使用一些转换步骤将这些结构转换为兼容代码。 Babel或TypeScript都可以这样做。因为Flow通常被链接到Babel,所以它基本上是“免费的”,就像它在TypeScript中一样。

TypeScript特定功能

如果要使用特定于TypeScript的enumnamespace,则必须使用TypeScript。如果你想使用Babel为你做ES6变换(也许你有一些想要运行的插件),你可以将TypeScript ES6输出链接到Babel,这样只有一个下层正在进行。

类型系统

Flow和TypeScript有一些不同的类型系统。有一些细微的差别,但没有什么大的。

每个人的支持者会向您展示在一个而不是另一个中工作的示例,例如

var arr = [10, "ok"];
arr.pop();
arr.push(10);
arr[1].substr(1); // crashes

function square(x) { return x * x };
console.log(square('a hundred')); // prints NaN

答案 1 :(得分:0)

Flow支持javascript注释中的类型注释,但我想象Flow的最大参数与Typescript相比,没有太多的转换。您的javascript保持不变,并获得静态类型的好处。另外,如果您阅读有关flow的文档,它有自己的方法来删除类型注释;认为它有点像编译。

编辑:看起来我不正确,打字稿也支持基于注释的注释。