ECMAScript 6 中是否支持静态类型?ECMAScript 7 怎么样?
5 回答
不。
但是在 ECMA-Script Wikipage 上有一段关于 ECMA-Script 7 的变化:
第七版处于非常早期的开发阶段,但旨在延续 ES6 的语言改革、代码隔离、效果控制和库/工具启用等主题。提议的新特性包括承诺/并发、数字和数学增强、守卫和商标(静态类型的替代)、运算符重载、值类型(一流的数字对象)、新的记录结构(记录、元组和类型化数组) 、模式匹配和特征。
您可能会感兴趣。
虽然这不是 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。
不,ECMAScript 6 (ES2015) 都不支持静态类型。
至于 ECMAScript 7 (ES2016),在任何阶段 1、2、3、4或阶段 0都没有关于静态类型的提议。
我在es-discuss邮件列表中看到了一些关于静态类型的建议/想法,但实际上这些都没有针对 ES7(ES2016)提出。
如果你现在想要静态类型,你可能最好研究 TypeScript 或 Flow。
虽然它不是纯 ES6,但 Google 的 AtScript 使用类型注释扩展 ES6,并在编译器公开后编译成有效的 ES6 代码:AtScript 入门
作为一个选项,您可以查看 EsLint 插件https://github.com/yarax/typelint
这不是静态检查,而是可选的。TypeLint 的好处是使用已经存在的应用程序数据来自动构建和使用类型,这与 TypeScript 或 Flow 不同,您必须自己描述复杂的类型。