【问题标题】:Do ECMAScript 2016 decorators make TypeScript decorators redundant?ECMAScript 2016 装饰器是否使 TypeScript 装饰器变得多余?
【发布时间】:2017-06-23 13:12:04
【问题描述】:

TypeScript 是 ECMAScript 2015 的严格超集,并且已经支持装饰器。这是否意味着随着 ECMAScript 2016 装饰器的引入,TypeScript 装饰器变得多余,或者这是否意味着 TypeScript 必须更改其底层实现以生成 ECMAScript 2016 装饰器?

【问题讨论】:

  • 只要 90% 的时间你在生成 ES5,你就不会真正关心它...... es2016 和 typescript 都会被转换成别的东西
  • true 但我说的是打字稿不再生成 ES5 的时间。
  • 装饰器不是 ES2016 的一部分。

标签: typescript ecmascript-6 ecmascript-2016 ecmascript-next


【解决方案1】:

正如docs regarding decorators 中所述:

装饰器是一项实验性功能,未来可能会发生变化 发布

Typescript 允许您通过将输出编译成与目标环境匹配的 js 来使用尚未在所有 js 环境中实现的未来功能。

例如:

function deco(constructor: Function) { }

@deco
class A { }

编译成:

var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
function deco(constructor) { }
var A = (function () {
    function A() {
    }
    return A;
}());
A = __decorate([
    deco
], A);

如您所见,js 版本包含使其工作所需的一切。
如果有什么改变,那么是的,编译器会改变输出正确的js。

【讨论】:

  • 请看我不理解生成的代码__decorate,如果为转译器更改底层实现,它肯定会使代码对像我这样的人更具可读性,尽管完全不确定可读性转译器的一个原则,他们宁愿继续以相同的方式生成,直到出现问题。
  • 编译后的 js 并不是为了可读,而是为了工作并且尽可能少的占用空间。您不应该自己更改编译后的 js,您应该相信编译器会根据您指定的目标输出正确的代码。
  • @ishandutta2007 我猜你要问的是 TS 装饰器最终是否会编译为 ES 装饰器。这是一个公平的问题,我认为我们还不知道答案,但我预计这很有可能。已经有ES2016, ES2017, ESNext 目标,但我不知道编译器是否为这些目标中的任何一个发出 ES 装饰器(目前),我也不知道它们是否是兼容的规范。我也想知道这个!
  • 不让它转译装饰器会非常有用。我正在使用一个为我处理它们的下游转译器,这是更广泛的构建环境的一部分。所以我希望他们逐字输出。除了破解编译器,它似乎并不明显。
  • @RichardCorfield 我不确定你的意思。据我所知,大多数 js 运行时环境仍然不支持装饰器。如果您不想使用 ts 编译器(或 babel)的输出,您希望它们如何运行
猜你喜欢
  • 1970-01-01
  • 2022-08-15
  • 2018-01-22
  • 1970-01-01
  • 2017-02-04
  • 2018-06-08
  • 2019-02-23
  • 2019-07-29
  • 2012-01-20
相关资源
最近更新 更多