30

ECMAScript 6 中是否支持静态类型?ECMAScript 7 怎么样?

4

5 回答 5

16

不。

但是在 ECMA-Script Wikipage 上有一段关于 ECMA-Script 7 的变化:

第七版处于非常早期的开发阶段,但旨在延续 ES6 的语言改革、代码隔离、效果控制和库/工具启用等主题。提议的新特性包括承诺/并发、数字和数学增强、守卫和商标(静态类型的替代)、运算符重载、值类型(一流的数字对象)、新的记录结构(记录、元组和类型化数组) 、模式匹配和特征。

您可能会感兴趣。

于 2014-03-14T14:30:49.837 回答
6

虽然这不是 ES6 规范的一部分,但Closure Compiler在使用其高级编译级别时会在 JavaScript 代码中强制执行 JSDoc 参数类型注释。类型注释是使用注释指定的,因此它们在开发中会被忽略,但是当您为生产版本构建应用程序时,类型不匹配将导致编译器警告或编译器错误(可选)。

强制 JSDoc 类型注释的示例:

/**
 * @param {string} stringValue
 * @return {number}
 */
function toInt(stringValue) {
  return parseInt(stringValue, 10);
}

var val = toInt("10"); // Good
var val = toInt(false); // NaN in development, but throws an error (optional) 
                        // or prints a warning (default) at build time

作为额外的好处,JSDoc 可以使用相同的语法构建 API 文档。因此,如果您记录代码也很方便。

但要注意:要使 Closure Compiler 发挥其高级优化魔法,您项目中的每个工程师都必须遵循某些严格的编码约定。除非编译器能够可靠地确定您的代码在做什么,否则编译器无法强制执行类型,这意味着放弃一些 JavaScript 的动态和虚伪的语法。如果您不遵循它们,错误可能会潜入您的应用程序,并且在事后很难诊断。大多数流行的 JavaScript 框架和库都不遵循它们,尽管有时您可以使用 Compiler 的 externs 功能解决这个问题。(例如,使用 externs 支持 jQuery。)

因此,如果您确实使用它,请确保彻底测试您的应用程序。我个人什至不会考虑在 Web 应用程序上使用此功能,除非它具有 Jenkins 构建机器人和近 100% 的自动化测试覆盖率,可以在优化针对您的代码运行。这是很多工作,并不适合所有人。我花了几个月的时间才让我的一个项目达到这个水平。但就个人而言,我认为这是非常值得的努力。

有关更多信息,请查看高级编译和外部以及为闭包编译器注解 JavaScript

于 2015-01-14T02:26:58.970 回答
3

不,ECMAScript 6 (ES2015) 都不支持静态类型。

至于 ECMAScript 7 (ES2016),在任何阶段 1、2、3、4阶段 0都没有关于静态类型的提议。

我在es-discuss邮件列表中看到了一些关于静态类型的建议/想法,但实际上这些都没有针对 ES7(ES2016)提出。

如果你现在想要静态类型,你可能最好研究 TypeScript 或 Flow。

于 2016-01-01T01:22:12.963 回答
0

虽然它不是纯 ES6,但 Google 的 AtScript 使用类型注释扩展 ES6,并在编译器公开后编译成有效的 ES6 代码:AtScript 入门

于 2014-11-14T11:04:38.060 回答
0

作为一个选项,您可以查看 EsLint 插件https://github.com/yarax/typelint

这不是静态检查,而是可选的。TypeLint 的好处是使用已经存在的应用程序数据来自动构建和使用类型,这与 TypeScript 或 Flow 不同,您必须自己描述复杂的类型。

于 2016-08-02T21:06:17.240 回答