2017-02-06 37 views
1

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

+1

只要您生成ES5的时间有90%,您并不真正关心它...... es2016和typecript都会转换为其他东西 – smnbbrv

+0

true,但我正在谈论打字稿不再生成的时间ES5。 – ishandutta2007

+2

修饰者不是ES2016的一部分。 –

回答

4

因为它在docs regarding decorators指出:

装饰是一个实验性功能,可能会在未来 版本

打字稿,您可以使用未仍处在所有的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。

+0

看到我不明白生成的代码'__decorate'的任何一点,如果将underling实现更改为transpiler,那么它肯定会使代码对于像我这样的人更具可读性,但不确定reablity完全是transpiler和thay的原则宁愿继续以相同的方式生成,直到出现故障。 – ishandutta2007

+3

编译后的js并不意味着可读,它的意思是工作,尽可能少占用空间。您不应该自己更改编译的js,并且您应该相信编译器会根据您指定的目标输出正确的代码。 –

+1

@ ishandutta2007我猜你在问什么TS装饰器最终会编译成ES装饰器。这是一个公平的问题,我认为我们现在还不知道答案,但我认为这很可能。已经有'ES2016,ES2017,ESNext'目标,但是我不知道编译器是否会为这些目标发射ES装饰器,我也不知道它们是否兼容目前的兼容规格。我也想知道这一点! – Aaron