2017-02-06 93 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