【问题标题】:Is there support for static typing in ECMAScript 6 or 7?ECMAScript 6 或 7 中是否支持静态类型?
【发布时间】:2014-04-19 21:46:49
【问题描述】:

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

【问题讨论】:

    标签: javascript ecmascript-6 static-typing ecmascript-2016


    【解决方案1】:

    没有。

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

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

    您可能会感兴趣。

    【讨论】:

    【解决方案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 ExternsAnnotating JavaScript for the Closure Compiler

    【讨论】:

      【解决方案3】:

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

      对于 ECMAScript 7 (ES2016),stages 1, 2, 3, 4stage 0 中的任何一个都没有针对静态类型的提议。

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

      如果你现在想要静态类型,你最好看看 TypeScript 或 Flow。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-09-30
          • 1970-01-01
          • 2012-11-30
          • 2014-10-04
          • 2019-07-29
          • 1970-01-01
          • 1970-01-01
          • 2016-01-03
          • 1970-01-01
          相关资源
          最近更新 更多