ECMAScript 6 或 7 中是不是支持静态类型?
Posted
技术标签:
【中文标题】ECMAScript 6 或 7 中是不是支持静态类型?【英文标题】:Is there support for static typing in ECMAScript 6 or 7?ECMAScript 6 或 7 中是否支持静态类型? 【发布时间】:2014-04-19 21:46:49 【问题描述】:ECMAScript 6 中是否支持静态类型? ECMAScript 7 怎么样?
【问题讨论】:
【参考方案1】:没有。
但是在 ECMA-Script Wikipage 上有一段关于 ECMA-Script 7 的变化:
第七版处于非常早期的开发阶段,但旨在延续 ES6 的语言改革、代码隔离、效果控制和库/工具启用等主题。提议的新功能包括承诺/并发、数字和数学增强、保护和商标(静态类型的替代)、运算符重载、值类型(一流的数字对象)、新的记录结构(记录、元组和类型化数组)、模式匹配和特征。
您可能会感兴趣。
【讨论】:
保护和商标似乎不在路线图 atm 上;类型/类型注释可能是类型检查的唯一功能:github.com/kangax/compat-table/issues/598【参考方案2】:虽然这不是 ES6 规范的一部分,Closure Compiler 在使用其高级编译级别时在 javascript 代码中强制执行 JSDoc 参数类型注释。类型注释是使用 cmets 指定的,因此它们在开发中会被忽略,但是当您为生产版本构建应用程序时,类型不匹配将导致编译器警告或编译器错误(可选)。
一个强制的 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% 的自动化测试覆盖率,可以在优化后对您的代码运行。这是很多工作,并不适合所有人。我花了几个月的时间才让我的一个项目达到这个水平。但就个人而言,我认为这是值得的。
如需了解更多信息,请查看Advanced Compilation and Externs 和Annotating JavaScript for the Closure Compiler。
【讨论】:
【参考方案3】:不,ECMAScript 6 (ES2015) 都不支持静态类型。
对于 ECMAScript 7 (ES2016),stages 1, 2, 3, 4 或 stage 0 中的任何一个都没有针对静态类型的提议。
我在es-discuss 邮件列表中看到了一些静态类型的提议/想法,但实际上没有一个针对 ES7 (ES2016) 提出。
如果你现在想要静态类型,你最好看看 TypeScript 或 Flow。
【讨论】:
【参考方案4】:虽然它不是纯 ES6,但 Google 的 AtScript 使用类型注释扩展 ES6,并在编译器公开后编译成有效的 ES6 代码:AtScript primer
【讨论】:
同样,还有TypeScript,这可能比 AtScript 更常见。 现在只是打字稿 - sdtimes.com/…【参考方案5】:作为一个选项,您可以查看 EsLint 插件 https://github.com/yarax/typelint
这不是静态检查,而是可选的。 TypeLint 的好处是使用现有的应用程序数据来自动构建和使用类型,这与 TypeScript 或 Flow 不同,您必须自己描述复杂的类型。
【讨论】:
以上是关于ECMAScript 6 或 7 中是不是支持静态类型?的主要内容,如果未能解决你的问题,请参考以下文章
sh RPM使用静态OpenSSL 1.1在CentOS 6/7上使用ALPN构建Nginx 1.11.x(在Chrome中支持http / 2支持需要1.02+)