2017-02-06 5 views
1

TypeScript является строгим дополнением ECMAScript 2015 и уже имеет поддержку декоратора. Означает ли это, что с внедрением декораторов ECMAScript 2016 декодеры TypeScript становятся излишними или означает ли это, что нужно идти вперед. TypeScript должен изменить свою базовую реализацию для создания декораторов ECMAScript 2016?Декораторы ECMAScript 2016 делают излишние декодеры TypeScript?

+1

до 90% времени, когда вы генерируете ES5, вам это действительно неинтересно ... И es2016, и машинопись будут преобразованы в что-то еще – 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 - это вообще принцип транспилятора и thay предпочли бы продолжать генерировать то же самое, пока что-то не сломается. – ishandutta2007

+3

Скомпилированный js не предназначен для чтения, он предназначен для работы и имеет как можно меньше места. Вы не должны изменять скомпилированный js самостоятельно, и вам следует доверять, что компилятор выведет правильный код на основе указанного вами целевого объекта. –

+1

@ ishandutta2007 Я предполагаю, что вы спросите, будут ли декодеры TS в конечном итоге скомпилировать декодеры ES. Это справедливый вопрос, я не думаю, что мы знаем ответ на этот вопрос, но я ожидаю, что это вероятно. Есть уже задачи ES2016, ES2017, ESNext', но я не знаю, испускает ли компилятор декораторы ES для любой из этих целей (пока), и я не знаю, являются ли они даже совместимыми спецификациями на этом этапе. Я тоже хотел бы знать это! – Aaron