Facebook 的 Flow 支持 type annotations . Specyfing 类型在 JavaScript 中是不可用的(并且可能永远不会,因为它的弱类型性质)——它是 TypeScript 的一个主要特性。语言。
我的问题是 - 应该如何在 JavaScript 代码中使用 Flow 的类型注释,知道 JS 不支持类型注释 - 它只是语言之外的东西。
我的评论:当然,我可以使用另一个 JS 预处理器来删除注释(无论是在 grunt、gulp、webpack 还是其他什么下),但这是一个额外的步骤,使自动化更加昂贵。这对我来说似乎是非常糟糕的设计,所以我想可能有比这更好的解释/解决方案。
此外,类型注释是 TypeScript 的一项功能。既然 Flow 支持它,那是否意味着 Flow 的目标不仅是 JavaScrpt,而且是 TypeScript?如果是这样,那我为什么要使用流而不是 TypeScript?
最佳答案
这里有很多选择。
类型注解
在 Flow 或 TypeScript 中,您可以使用类型注释或注释。如果您不在 TypeScript 中使用类型注释,您可以只使用 --allowJs
标志并照常在 JS Doc 注释中编写您的类型:
如果您正在使用句法类型注释(例如 a: string
),您将需要使用 Babel 或 TypeScript 来删除它们。
ES6 特性
如果您正在使用类、导入、箭头函数等 ES6+ 功能,并希望以兼容 ES5 的浏览器为目标,则需要使用一些转换步骤将这些结构转换为兼容代码。 Babel 或 TypeScript 都可以做到这一点。由于 Flow 通常与 Babel 相关联,因此它基本上是“免费”的,就像在 TypeScript 中一样。
TypeScript 特有的特性
如果你想使用特定于 TypeScript 的 enum
或 namespace
,你必须使用 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
关于javascript - (facebook) flow - 类型注解是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39704732/