Typescript: рд╕рдЬреНрдЬрд╛рдХрд╛рд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдорд╛рд░реНрдЪ 2015  ┬╖  139рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

ES7 рдкреНрд░рд╕реНрддрд╛рд╡

рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП ES7 рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: https://github.com/wycats/javascript-decorators
ES7 рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдиреАрдЪреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдиреЛрдЯреНрд╕ рджрд┐рдП рдЧрдП рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреИрд╕реЗ рдЯрд╛рдЗрдк рдХрд░реЗрдВ

рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рдХреНрд╖реНрдп:

рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░

@F("color")
<strong i="12">@G</strong>
class Foo {
}

desugars рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

var Foo = (function () {
    function Foo() {
    }
    Foo = __decorate([F("color"), G], Foo);
    return Foo;
})();

рддрд░реАрдХреЛрдВ

class Foo {
  @F(color)
  <strong i="19">@G</strong>
  bar() { }
}

desugars рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

var Foo = (function () {
    function Foo() {
    }
    Foo.prototype.bar = function () {
    };
    Object.defineProperty(Foo.prototype, "bar", __decorate([F(color), G], Foo.prototype, "bar", Object.getOwnPropertyDescriptor(Foo.prototype, "bar")));
    return Foo;
})();

рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐

class Foo {
    @F("color")
    <strong i="26">@G</strong>
    static sMethod() {}
}

desugars рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

var Foo = (function () {
    function Foo() {
    }
    Foo.sMethod = function () {
    };
    Object.defineProperty(Foo, "sMethod", __decorate([F("color"), G], Foo, "sMethod", Object.getOwnPropertyDescriptor(Foo, "sMethod")));
    return Foo;
})();

рдЧреБрдг

class Foo {
    @F("color")
    <strong i="33">@G</strong>
    prop: number;
}

desugars рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

var Foo = (function () {
    function Foo() {
    }
    __decorate([F("color"), G], Foo.prototype, "prop");
    return Foo;
})();

рд╡рд┐рдзрд┐/рдПрдХреНрд╕реЗрд╕рд░ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░

class Foo {
    method(<strong i="40">@G</strong> a, @F("color") b) {}
}

desugars рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

var Foo = (function () {
    function Foo() {
    }
    Foo.prototype.method = function (a, b) {
    };
    __decorate([G], Foo.prototype, "method", 0);
    __decorate([F("color")], Foo.prototype, "method", 1);
    return Foo;
})();

рдЬрд╣рд╛рдВ __decorate рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

var __decorate = this.__decorate || function (decorators, target, key, value) {
    var kind = typeof (arguments.length == 2 ? value = target : value);
    for (var i = decorators.length - 1; i >= 0; --i) {
        var decorator = decorators[i];
        switch (kind) {
            case "function": value = decorator(value) || value; break;
            case "number": decorator(target, key, value); break;
            case "undefined": decorator(target, key); break;
            case "object": value = decorator(target, key, value) || value; break;
        }
    }
    return value;
};

рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░:

рдПрдХ рд╡реИрдз рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп (рдХреНрд▓рд╛рд╕рдбреЗрдХреЛрд░реЗрдЯрд░ | рдкреНрд░реЙрдкрд░реНрдЯреАрдбреЗрдХреЛрд░реЗрдЯрд░ | рдореЗрдердбрдбреЗрдХреЛрд░реЗрдЯрд░ | рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрдХреЛрд░реЗрдЯрд░) рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИред
  2. рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рдПрдВ (рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдФрд░ рдореЗрдердб рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯреЗрдб рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
declare type ParameterDecorator = (target: Function, propertyKey: string | symbol, parameterIndex: number) => void;

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ:

  • рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд╛рдпрд░реЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдлрд╣рд░рд╛рдиреЗ рд╕реЗ рд░реЛрдХ рджреЗрдЧрд╛, рдЬреЛ рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред
  • рдбреЗрдХреЛрд░реЗрдЯрд┐рдВрдЧ рдлрдВрдХреНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдФрд░ рдПрд░реЛ рдлрдВрдХреНрд╢рди рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ var x = dec(function () { }); рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рдбреЗрдХреЛрд░реЗрдЯрд┐рдВрдЧ рдлрдВрдХреНрд╢рди рдФрдкрдЪрд╛рд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ ES7 рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред
  • ES3 рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ
Committed ES Next Fixed Suggestion

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлрдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрд╢рди рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдХреНрдпрд╛ рдХреЛрдб рдореЗрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рднреА рдпреЛрдЬрдирд╛ рд╣реИ?

рд╕рднреА 139 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рдЬреЛ рдпреБрдХреНрддрд┐ рд╕рдордЭ рдореЗрдВ рдЖрддреА рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ:

<strong i="6">@F</strong>
function test() {
}

рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВрдБ ?

рдЯрд╛рдЗрдк рдХреНрд░рдорд╛рдВрдХрди рдмрд╛рдХреА рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

@F()  
class Foo {  
    constructor(...args: string[]) {  
    }  
}  

function F(<strong i="6">@paramterTypes</strong> types?: Function[]) {  
    return function (target) {  
        target.paramterTypes = types; // ???  
    }  
}

рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рднреНрд░рд╛рдордХ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рдкрд╛рдпрд╛ред C.4 рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ @decorator рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░рд┐рдпрд╛рдВ рдмреА рдореЗрдВ рдкрд╛рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдмрдирдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреА рд╣реИрдВ?

CoverMemberExpressionSquareBracketsAndComputedPropertyName рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рдпрдо рдХреНрдпрд╛ рд╣реИ?

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХрдИ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ Function | Object , рд▓реЗрдХрд┐рди рдпреЗ рдЯрд╛рдЗрдк рдЪреЗрдХ рдЯрд╛рдЗрдо рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рд╡рд╣рд╛рдВ рдлрдВрдХреНрд╢рди рд╣реЛрдиреЗ рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ?

рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрдВрдХреНрд╢рди рдмрдирд╛рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░реА рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╛рдЧрд▓ рдирд╣реАрдВ рд╣реВрдВред рдореИрдВ рдЬреЗрдирд░реЗрдЯрд░ рдХреЗ рдирд╛рдордХрд░рдг рдХрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдЬреЗрдирд░реЗрдЯрд░ рдФрд░ рдЬреЗрдирд░реЗрдЯрд░рдлрдВрдХреНрд╢рди рд╣реИред рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрдВрдХреНрд╢рди рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░реА рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗред

рд╕рдЬрд╛рдП рдЧрдП рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд▓рд┐рдП, [lookahead тЙа @] рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣реИ? рдХреНрдпрд╛ HoistableDeclaration рдФрд░ ClassDeclaration рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @ ?

рдпрд╣ #1557 . рдХрд╛ рдвреЛрдВрдЧ рд╣реИ

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдбреБрдкреНрд▓реА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ # 1557 рдПрдХ рдЕрд▓рдЧ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдерд╛ред рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рд╣реИред

рдореЗрд░реА рдЧрд▓рддреАред

рдлрдВрдХреНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ:

@F("color") <strong i="6">@G</strong> 
function myFunc() {
   doSomething();
}

рдореЗрдВ рддрдмреНрджреАрд▓:

var _t = function() {
   doSomething();
}
_t = F("color")(_t = G(_t) || _t) || _t;  

function myFunc() {
  return _t.apply(this, arguments)
}

рд╣рд░ рдлрдВрдХреНрд╢рди рдХреЛ рд╕рд╣реА рдХрд░рдирд╛ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ:

const myFunc = function () {}

рдЖрдкрдиреЗ рдЙрддреНрдерд╛рдкрди рдвреАрд▓рд╛ рдХрд░ рджрд┐рдпрд╛, рдФрд░ function.name

рдкреАрдЖрд░ #2399 . рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛

рдЕрдкрдбреЗрдЯ: рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдФрд░ @wycats ES7 рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЧ рдмрди рдЧрдпрд╛ ...
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдВрдмрд┐рдпрдВрдЯ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╡реЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдП?

рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде @fdecampredon , рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрднреА рднреА рдЙрддреНрдерд╛рдкрди рдЦреЛ рд░рд╣реЗ рд╣реИрдВред

@JsonFreeman рдХреНрдпреЛрдВ? рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ _t рдбрд╛рд▓рддреЗ рд╣реИрдВ?

import something from 'something';

myFunc(something.something());

@F("color") <strong i="8">@G</strong> 
function myFunc() {
  doSomething()
}
import something from 'something';

var _t = function() {
   doSomething();
}
_t = F("color")(_t = G(_t) || _t) || _t;  

myFunc(something.something());

function myFunc() {
  return _t.apply(this, arguments)
}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд▓реЗ рд╣реА рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореБрджреНрджреЗ рд╣реЛрдВ, рдореИрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рднрд▓реЗ рд╣реА рдореБрдЭреЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝реЗ) рдФрд░ рдЙрддреНрдерд╛рдкрди рдЦреЛрдирд╛ред
рдЗрд╕ рддрд░рд╣ рдХрд╛ рдорд╛рдорд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдХреНрд▓рд╛рд╕ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдкрд░рд┐рд╡реЗрд╢ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдпрджрд┐ рд╡реЗ рдЕрднреА рднреА рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИрдВ)

@fdecampredon рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╕реНрд╡рдпрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВред рдЬреИрд╕реЗ

myFunc();  // assumes function declaration is hoisted

var dec = (t) => t; // defininig a decorator

<strong i="7">@dec</strong>
function myFunc() {}

рдпрджрд┐ рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдлрдВрдХреНрд╢рди рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд╣рд░рд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рддреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдлрдВрдХреНрд╢рди рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдХреЛ рдлрд╣рд░рд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд╣реАрдВ, рддреЛ рдЖрдк рдлрдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЕрдШреЛрд╖рд┐рдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреЛрдИ рдЖрдХрд░реНрд╖рдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╡рд╣реА рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рдЦрдВрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ ES6 рдореЗрдВ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред рдкрд░рд┐рдгрд╛рдо рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдлрд╣рд░рд╛ рд░рд╣рд╛ рдерд╛, рдХреЗрд╡рд▓ рдкреНрд░рддреАрдХ (var рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдп рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ)

рдУрд╣реНрд╕ рдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ @mhegazy рдзрдиреНрдпрд╡рд╛рджред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд╝рдВрдХреНрд╢рди рднрд╛рдЧ рдиреЗ рдореВрд▓ @jonathandturner рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛, рдЗрд╕рдХрд╛ рдирд┐рдпрдо рдерд╛:

decorated function declarations cannot be hoisted to the containing scope

рдЙрддреНрдерд╛рдкрди рдЦреЛрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЦрд╛рдореА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдЕрдиреНрдп рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрдЯ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ:

  • рд╕рдЬрд╛рдпрд╛ рд╕рдорд╛рд░реЛрд╣ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реА рдлрдВрдХреНрд╢рди рдХреЛ рд╕рдЬрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЛ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реНрд╡рдпрдВ (рдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рд╕рднреА рдЗрдХрд╛рдЗрдпрд╛рдВ) рдХреЛ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдбреЗрдХреЛрд░реЗрдЯрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЛ рдлрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛

рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрдХрд▓реНрдк рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ: рдлрд╝рдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ @identifier рдлрд╝реЙрд░реНрдо рдХреА рдХреБрдЫ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╣рдо рдмрд╛рдПрдВ рд╣рд╛рде рдХреА рдУрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ (рд╕рдЬрд╛рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рд╕рд╣рд┐рдд) рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрджрд░реНрдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдХреЛрдк рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдлрдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрд╢рди рдХреЛ рд╕реНрдХреЛрдк рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЙрддреНрдерд╛рдкрди рдирд┐рдпрдореЛрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИред рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдПрдВ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреА; рдЕрдм рдПрдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рд╕рд░рд▓ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдорд╛рд░реНрдХрд░ (рд╕рдЬреНрдЬрд╛рдХрд╛рд░) рдЬреЛрдбрд╝рдХрд░ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреА рдЗрд╕ рдореМрд▓рд┐рдХ рдкреНрд░рдХреГрддрд┐ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд╣рдиреЗ рдХреЗ рдмрд╛рдж, ES7 рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрднреА рднреА рдЕрдкрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрдЧрд╛; рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╕рдорд╛рд░реЛрд╣реЛрдВ рдкрд░ рд╕рдЬрд╛рд╡рдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЦреБрдж рдХреЛ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдУрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рд╕рдЬрд╛рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдлрд╣рд░рд╛рдирд╛ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдкрдиреА рдЕрд╢реЛрднрдиреАрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

<strong i="7">@dec1</strong>
function dec2(target: Function) {
   // Do stuff
}

<strong i="8">@dec2</strong>
function dec1(target: Function) {
   // Do stuff
}

рднрд▓реЗ рд╣реА рджреЛрдиреЛрдВ рд╕рдорд╛рд░реЛрд╣ рдлрд╣рд░рд╛рдП рдЬрд╛рдПрдВ, рдлрд┐рд░ рднреА рдХреМрди рд╕рд╛ рдкрд╣рд▓реЗ рд╕рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдпрджрд┐ dec2 рдХреЛ рдкрд╣рд▓реЗ рд╕рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ dec1 рдХреЛ рдЙрд╕ рд╕рдордп рддрдХ рдирд╣реАрдВ рд╕рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ dec2 рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  • рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдлрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ
  • рдЕрд▓рдВрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдХреЛрд░реЗрдЯрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЙрдирдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдлрд╣рд░рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЬрдмрдХрд┐ рдореБрдЭреЗ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдФрд░ рдХреБрдЫ рднреА рд╕рдВрднрд╡ рд╣реИред

рдпрд╣ рдЬреЗрдПрд╕ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрдВрдЬрди рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рд╣рдо рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЛ:

<strong i="6">@dec1</strong>
function dec2(target: Function) {
   // Do stuff
}

dec2 = undefined;

<strong i="7">@dec2</strong>
function dec1(target: Function) {
   // Do stuff
}

рдЙрд╣! рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдм рдФрд░ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИред :-)

рдЗрд╕реЗ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди _expressions_ рдкрд░ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:

const foo = <strong i="6">@decorator</strong> () => {
    // ...   
}
const bar = <strong i="7">@decorator</strong> function() {
    // ...
}

рдлрдВрдХреНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдпрд╛ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 1.5.0-рдЕрд▓реНрдлрд╛ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реИ?

@dec1({key1: value1, key2, value2})
function dec2(target: Function) {
   // Do stuff
}

рдареАрдХ рд╣реИ, рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдмрд╕ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓рд╛ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░:

function decoratorWithString(param: string) { // Decorator factory
    return function(target) { // Actual decorator
        // Do stuff with target and string parameter
    }
}

// Usage
@decoratorWithString('foobar')
class Foo {

}

рдЕрднрд┐рд╡рд╛рджрдиред

рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрдард╛рдПрдЧрд╛ред

рдпрд╣рд╛рдВ рдХреБрдЫ рдХреЛрдб рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдбрд╝реА рдореЗрд╣рдирдд рд╣реИред рдореБрдЭреЗ рдХрдХреНрд╖рд╛ рдбреА рдореЗрдВ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдШреЛрд╖рдгрд╛ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

class A {
  public message = "identity: class A";
}

class B {
  public message = "identity: class B";
}

<strong i="8">@decoTest</strong>
class D {
  static metadata:Array<Function> = [];
  constructor(a: A, b: B) {
  }
}
describe("decorators", function() {
  it("should inject constructor types", function() {
    var d = new D(new A(), new B());
    expect(D.metadata.length).toBe(2);
  });
});


function decoTest<T>(target: T, ...rest) {
  target["metadata"].push(A, B); // how do i get this based on constructor ???
  return target;
}

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред
рдЖрдк рдЙрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ ParameterDecorator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

ParameterDecorator рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рд▓рдХреНрд╖реНрдп рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред
рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдХреНрд╖реНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛:

function MyParameterDecorator (_target: Function, methodName: string, index: number) {
    const target = <InterfaceForMyUseCase><anyt>_target;
    // do stuff
}

рдХреЗ рдмрдЬрд╛рдП:

function MyParameterDecorator (target: InterfaceForMyUseCase, methodName: string, index: number) {
    // do stuff
}

рд╡рд╛рд╣ - рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдирд┐рдпрдо !!!!!!!!!!!!!!! рдпрд╣ рд░реЗрдкреЛ рджреЗрдЦреЗрдВ

рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

LOG: 'injectMe:'
LOG: '  type: class A'
LOG: '  type: class B'
LOG: '  some key'

рдФрд░ рдХреЛрдб :

module ParameterDecorators {
  class A {
    static typeName:string = "type: class A";
    public instanceTypeName = "instance: class A";
  }

  class B {
    static typeName:string = "type: class B";
    public instanceTypeName = "instance: class B";
  }

  @injectTest(A, B, "some key")
  class C {
    static injectMe: Array<any> = [];
    constructor(a: A, b: B) {
    }
  }

  function injectTest(...rest) {
    return function(target): void {
      target["injectMe"] = rest;
    }
  }

  describe("decorators", function() {
    it("should inject dependency-injection keys", function() {
      var c = new C(new A(), new B());
      console.log("injectMe:");
      for (let parm of C.injectMe) {
        if (typeof(parm) === "function") {
          console.log("\t" + parm["typeName"]);
        } else {
          console.log("\t" + parm)
        }
      }
    });
  });
}

рдореИрдВрдиреЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд░реИрдкрд░ рдмрдирд╛рдпрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рд╡реЗрдм рдврд╛рдВрдЪреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде: https://github.com/cybrown/web-decorators

рдореИрдВ ClassDecorator, ParameterDecorator рдФрд░ MethodDecorator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@cybrown рдореИрдВрдиреЗ рдЕрднреА #2635 рдореЗрдВ ParameterDecorator рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╣реИред

@rbuckton рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдХрд▓ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░ рджреВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реИ?
рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХрд╛ рдЖрдзрд╛ рд╕рдордп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдорд┐рдиреАрдлрд╛рдпрд░ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдореИрдВрдЧрд▓рд┐рдВрдЧ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ:

@inject(A, B, "some key")
  class C {
    static injectMe: Array<any> = [];
    constructor(a: A, b: B) {
    }
  }

  function inject(...rest) {
    return function(target): void {
      target["inject"] = rest;
    }
  }

рд▓реЗрдХрд┐рди рдЗрдВрдЬреЗрдХреНрдЯ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╡рд░реНрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдард╛рддреЗ рд╣реИрдВ:

inject(<strong i="9">@parameterTypes</strong> types:Function[]){ ... }

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ @jonathandturner рдпрд╣рд╛рдБ рд╡рд░реНрдгрди рдХрд░рддрд╛

@cmichaelgraham рд╣рд╛рдВ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА (рдЖрд░рдЯреАрдЯреАрдЖрдИ рдЬреИрд╕рд╛ рдХрд┐ рдПрдЯрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ) рдЙрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдЬреИрд╕реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рднреАред

@cmichaelgraham рд╣рдо ES7 рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ API рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред #2589 рдЙрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

@rbuckton @cmichaelgraham рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдерд╛ рдЬреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рдЬреЛ рд▓рдХреНрд╖реНрдп рдХреЛ рд╕рдЬрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ @parameterTypes рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рдореЗрдВ рд╕рд╣реА рд╣реВрдВ рдХрд┐ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдПрдкреАрдЖрдИ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЙрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ 1.5 рдХреА рд░рд┐рд▓реАрдЬ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛? рдПрдХ рдЪреАрдЬ рдЬреЛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

@EisenbergEffect рдбреЗрдХреЛрд░реЗрдЯрд░ 1.5 рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдЖрдк рдЗрд╕реЗ рд╣рдорд╛рд░реА рдирд╡реАрдирддрдо рд░рд┐рд▓реАрдЬрд╝ 1.5-alpha рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрдЯрд╛ рдбреЗрдЯрд╛ рд╕рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдПред @paramtypes рдХреЗ рдУрд░рд┐рдЬрд┐рдирд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рдж рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдирдпрд╛ desing рдкреНрд░рддрд┐рдмрд┐рдВрдм.рдореЗрдЯрд╛рдбрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП #2589 рджреЗрдЦреЗрдВред рд╕рд╛рде рд╣реА @rbuckton рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рд╣реИ: https://github.com/rbuckton/reflectDecorators

@mhegazy рдореБрдЭреЗ рдкрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: http://blog.durandal.io/2015/04/09/aurelia-update-with-decorators-ie9-and-more/ :smile:

рдореИрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рднреА рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВред рдореИрдВ рдЙрд╕ рдкрд░ рдлреАрдбрдмреИрдХ рджреЗрддрд╛ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореВрд▓ @parameterTypes рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдзрдиреНрдпрд╡рд╛рдж @EisenbergEffect рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред :+1:

рд╣рд╛рдВред @paramtypes рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рд┐рдВрдЧрд▓-рдореЙрдбреНрдпреВрд▓ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ (рджреЗрдЦреЗрдВ #2499)ред рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЗрд╕реЗ рдХреЙрд▓ рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рд░рдЦрдирд╛ рдерд╛, рдЬреЛ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдбреЗрдХреЛрд░реЗрдЯрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд╛рдкрд╕ рдбреНрд░рд╛рдЗрдВрдЧ рдмреЛрд░реНрдб рдкрд░ рдЧрдП рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд░рд┐рдлреНрд▓реЗрдХреНрдЯ.рдореЗрдЯрд╛рдбреЗрдЯрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдЙрддрд░реЗред

рдпрджрд┐ рдЖрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рднреА рджреЗрдЦрд╛, рддреЛ рд╣рдореЗрдВ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдкрд░рд┐рд╡реЗрд╢/рдбрд┐рдЬрд╝рд╛рдЗрди-рдЯрд╛рдЗрдо рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рд╣рдЯрд╛рдирд╛ рдкрдбрд╝рд╛ред

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рд╕рдм рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдЕрдЧрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг 1.5 рдореЗрдВ рдЙрддрд░реЗрдЧрд╛?

рд╣рд╛рдВред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╣реИред рдпрд╣ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдзреНрд╡рдЬ --emitDecoratorMetadata рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдСрдкреНрдЯ-рдЗрди рд╕реБрд╡рд┐рдзрд╛ рд╣реИ; рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рд╕рдЬрд╛рдП рдЧрдП рдирд┐рдХрд╛рдпреЛрдВ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

"рдпрд╣ рдХреЗрд╡рд▓ рд╕рдЬрд╛рдП рдЧрдП рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ" рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИ? рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕реЗ рдХрд┐рд╕реА рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ? рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдХреЛрдИ рдбреЗрд╡рд▓рдкрд░ рдСрд░реЗрд▓рд┐рдпрд╛ рдХреЗ inject рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╡рд╣ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛?

рдпрджрд┐ рдХреЛрдИ рдбреЗрд╡рд▓рдкрд░ рдСрд░реЗрд▓рд┐рдпрд╛ рдХреЗ рдЗрдВрдЬреЗрдХреНрдЯ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╡рд╣ рд╕рдВрдХрд▓рдХ рдХреЛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛?

рд╣рд╛рдВред

рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛:

<strong i="9">@inject</strong>
class Foo {
    constructor(a: number, b: string) {}
}

class Bar {
    constructor(a: number, b: string) {}
}

--emitDecoratorMetadata рдХреЗ рд╕рд╛рде рдХрдВрдкрд╛рдЗрд▓рд░ Foo рд▓реЗрдХрд┐рди _not_ Bar рд▓рд┐рдП рдЯрд╛рдЗрдк рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдпрд╛рдиреА reflect.metadata('desing:paramtypes', [Number, String]) рдХреЙрд▓ рдХрд░реЗрдВ) рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░реЗрдЧрд╛ред

рд╡рд╣реА рд╣рдорд╛рд░реЗ рдХрд╛рдо рдЖрдПрдЧрд╛ред рд╣рдо рдЕрдкрдиреА рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд░рд┐рдлреНрд▓реЗрдХреНрдЯ.рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд╕рдВрднрд╡рдд: рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

``` рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
@рдЗрдВрдЬреЗрдХреНрдЯ
рдХрдХреНрд╖рд╛ рдлреВ {
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдП: рдП, рдмреА: рдмреА) {}
}

рдХрдХреНрд╖рд╛ рдмрд╛рд░ {
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдП: рдирдВрдмрд░, рдмреА: рдмреА) {}
}

would it be (for Foo):

``` javascript
reflect.metadata('desing:paramtypes', [A, B])

@cmichaelgraham рд╣рд╛рдВ, рдпрд╣ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред

рд╕рдирдХреА рдорд╕реНрдд !!!!

рдЗрд╕ рд░реЗрдкреЛ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд▓реНрдк-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ - (рдЕрдЪреНрдЫрд╛ рдХрд╛рдо @ivogabe)

gulpfile build-ts рдХрдорд╛рдВрдб ( emitDecoratorMetadata рд╡рд┐рдХрд▓реНрдк рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ):

gulp.task('build-ts', function () {
    var tsResult = gulp.src([
        './views/*.ts',
        './typings/**/*.d.ts',
        './*.ts'
        ],
        {base: "."})
    .pipe(ts({
         typescript: require('typescript'),
         declarationFiles: false,
         noExternalResolve: true,
         target: "es5",
         module: "amd",
         emitDecoratorMetadata: true
    }));

    return merge([
        tsResult.dts.pipe(gulp.dest('.')),
        tsResult.js.pipe(gulp.dest('.'))
    ]);
});

app.ts рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ

import {inject} from 'aurelia-framework';
import {Router} from 'aurelia-router';
import 'bootstrap';
import 'bootstrap/css/bootstrap.css!';

@inject(Router)
export class App {
  public router;
  constructor(router:Router) {
    this.router = router;
    this.router.configure(config => {
      config.title = 'Aurelia';
      config.map([
        { route: ['','welcome'],  moduleId: './welcome',      nav: true, title:'Welcome' },
        { route: 'flickr',        moduleId: './flickr',       nav: true },
        { route: 'child-router',  moduleId: './child-router', nav: true, title:'Child Router' }
      ]);
    });
  }
}

app.js

var __decorate = this.__decorate || (typeof Reflect === "object" && Reflect.decorate) || function (decorators, target, key, desc) {
    switch (arguments.length) {
        case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);
        case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0);
        case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc);
    }
};
var __metadata = this.__metadata || (typeof Reflect === "object" && Reflect.metadata) || function () { };
define(["require", "exports", 'aurelia-framework', 'aurelia-router', 'bootstrap', 'bootstrap/css/bootstrap.css!'], function (require, exports, aurelia_framework_1, aurelia_router_1, , ) {
    var App = (function () {
        function App(router) {
            this.router = router;
            this.router.configure(function (config) {
                config.title = 'Aurelia';
                config.map([
                    { route: ['', 'welcome'], moduleId: './welcome', nav: true, title: 'Welcome' },
                    { route: 'flickr', moduleId: './flickr', nav: true },
                    { route: 'child-router', moduleId: './child-router', nav: true, title: 'Child Router' }
                ]);
            });
        }
        App = __decorate([
            aurelia_framework_1.inject(aurelia_router_1.Router), 
            __metadata('design:paramtypes', [aurelia_router_1.Router])
        ], App);
        return App;
    })();
    exports.App = App;
});

рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдкреНрд░рдХрд╛рд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╣реИ:

        App = __decorate([
            aurelia_framework_1.inject(aurelia_router_1.Router), 
            __metadata('design:paramtypes', [aurelia_router_1.Router])
        ], App);

рдЗрд╕рд▓рд┐рдП рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрдВрдЬреЗрдХреНрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдЪрд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬреЗрдХреНрдЯ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :)

@cmichaelgraham рд╣рдо рдЖрдЬ рдврд╛рдВрдЪреЗ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдСрд░реЗрд▓рд┐рдпрд╛ рдХреА DI рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд╣реБрдХ container.addParameterInfoLocator ред рдЖрдк рдЗрд╕реЗ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реА рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬрд╝ (рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣) рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдХреЛрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреА рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдбрд╛рд▓ рджреЗрддрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИред

@EisenbergEffect рд╢рд╛рдирджрд╛рд░ !! :+1:

рдореИрдВрдиреЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рдПрдХ рдЖрджрд┐рдо рдХреЛ рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╡рд╕реНрддреБ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ (рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, https://github.com/mweststrate/MOBservable/commit/8cc7fc0e20c000db660037c8b5c9d944fe4155d9)ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рд▓рдЧрд╛ рдХрд┐ рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ this ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛ рдХрд╛рдо рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдирд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рдЧреЗрдЯрд░/рд╕реЗрдЯрд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдерд╛ рдЬреЛ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдХрд░рдирд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ this рдФрд░ рдореВрд▓реНрдп рддрдм рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдорд╛рд▓ рдХреА рд╕реБрд╡рд┐рдзрд╛!

рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреБрдг рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред
рдЖрдк рдпрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ https://github.com/matjaz/property-DI/commit/2b4835e100b72d954b57d0e656ea524539ac17ebред

рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рдореЗрдВ __рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рднреА рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ? рдореИрдВ рдХрдХреНрд╖рд╛ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓ рдбрд┐рдУрдХреНрд░реЗрдЯрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди __metadata('design:paramtypes', [TYPES...]) рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрди рдбреЗрдЯрд╛ рдХреЛ рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

@ufon рдХреНрдпрд╛ рдЖрдк рд╡рд╣ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ?

рдЬрд╝рд░реВрд░, рдпрд╣рд╛рдБ https://gist.github.com/ufon/5a2fa2481ac412117532

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдореЗрд░рд╛ рдмреБрд░рд╛, рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдФрд░ рдЧрд▓рддреА рд╣реИ, рдХреНрд▓рд╛рд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмрд╛рдж рднреА рдЯрд╛рдЗрдк рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ

@ufon , рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рддрдм рджреЗрдЦрддрд╛ рд╣реВрдВред __рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реВрдЪреА рдореЗрдВ рдЕрдВрддрд┐рдо рдЖрдЗрдЯрдо рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред

    House = __decorate([
        inject_1.inject, 
        __metadata('design:paramtypes', [Floor, String])
    ], House);

рдЬрд╣рд╛рдВ __decorate рдкрд░рд┐рднрд╛рд╖рд╛ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИред

decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);

рдпрд╣ рдХрд▓реНрдкрдирд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдШреЛрд╖рдгрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмрд╛рд╣рд░реА рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЖрдВрддрд░рд┐рдХ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рд╕реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдирд╛рд░рд╛рдЬ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ :) рдореЗрд░рд╛ рдмреБрд░рд╛, рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдФрд░ рдЧрд▓рддреА рд╣реИ, рдХреНрд▓рд╛рд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмрд╛рдж рднреА рдЯрд╛рдЗрдк рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ

рдЖрдк рдЙрдирдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдФрд░ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд┐рдлреНрд▓реЗрдХреНрдЯ.рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкреЛрд▓реАрдлрд┐рд▓ рд╣реИ?

рд╕рд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ ...
рдкреНрд░рддрд┐рдмрд┐рдВрдм.getMetadataKeys (рд╣рд╛рдЙрд╕);
рдпрд╣ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ ..

рд╣рд╛рдВ, рдореБрдЭреЗ 'рдкреНрд░рддрд┐рдмрд┐рдВрдм-рдореЗрдЯрд╛рдбреЗрдЯрд╛' рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреЙрд▓реАрдлрд┐рд▓ рдЗрд╕реЗ рдЦреЛ рд░рд╣рд╛ рд╣реИ, рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реЛрдЪреЛ рдореБрдЭреЗ рдорд┐рд▓ рдЧрдпрд╛ ...
рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдХреЗ рд╕рд╣рд╛рдпрдХ рдХреЛрдб рдХреЗ рдмрд╛рдж рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ

var __metadata = this.__metadata || (typeof Reflect === "object" && Reflect.metadata) || function () { };
require('reflect-metadata');

рдЗрд╕рд▓рд┐рдП, рд╕рдордп рдореЗрдВ var __metadata рдХреЛ рдЖрд░рдВрднрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдЕрднреА рддрдХ рд▓реЛрдб рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ рдпреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬрд┐рд╕реНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ .. рдЬрдм рдПрдХрд▓ рдореЙрдбреНрдпреВрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ __рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╣рд▓ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреЙрд▓реАрдлрд┐рд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рд╣рдореЗрд╢рд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдУрд╣ .. рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рд╣реИред рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдореБрджреНрджрд╛ #2811

рддрдм рддрдХ рдЖрдкрдХреЛ рджреВрд╕рд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ reflect-metadata рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЖрдкрдХреЛ рджреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рджреЗрдЦреЗрдВ https://github.com/matjaz/property-DI/

рдПрдХ рдЖрдордВрддреНрд░рдг рдЕрд╕рдВрдЧрддрддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдЬреЛ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рд╕рдЬрд╛рд╡рдЯреА рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп/рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкреЗ:

<strong i="6">@F</strong>
prop: number;

@F()
prop: number;

рдкреВрд░реНрд╡ рдореЗрдВ, F рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ (рд▓рдХреНрд╖реНрдп, рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо, рд╕рдВрдкрддреНрддрд┐ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░) рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмрд╛рдж рдореЗрдВ, F рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ () рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ (рд▓рдХреНрд╖реНрдп, рд╕рдВрдкрддреНрддрд┐рдирд╛рдо рдФрд░) рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░реЙрдкрд░реНрдЯреА рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░)ред

рдореЗрд░рд╛ _assumption_ рдпрд╣ рд╣реЛрддрд╛ рдХрд┐ @F рдФрд░ @F() рджреЛрдиреЛрдВ рд╕рдорд╛рди рд╣реЛрдВрдЧреЗ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ 0 рдпрд╛ рдЕрдзрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:

<strong i="13">@F</strong>  // Performs some default behaviour.
prop: number;

@F({ option: true }) // Performs some configured behaviour.
prop: number;

рдпрд╣ рд╕рд┐рд░реНрдл рд╕реНрдкрд╖реНрдЯ рд░реВрдк @F рдХреЗ рдмрдЬрд╛рдп @F () рдХреЙрд▓ рдХрд░рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ рдХрд┐ рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЖрд╕рд╛рди рд╣реИ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрдм рдЕрдкрдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рджрд┐рдЦрддрд╛ рджреНрд╡рд╛рд░рд╛ рднрд▓реЗ рд╣реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

export function F(options?: any): PropertyDecorator {
    return (target, name) => {
        // do something.
    }
}

рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдЪреНрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ:

export function F(...args: any[]): any {
   var func = (target, name) => {
      // do something.
   }

   if (args.length === 1) return func;
   else if (args.length === 2) func(args[0], args[1]);
}

рдЬреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд░реНрдж рд╣реИред

@ рдерд╛рд░реИрдХреНрд╕рд┐рд╕ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред @F рдФрд░ @F() рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИрдВред @F рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ F , рдЬрд╣рд╛рдВ @F() рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ F рдЦрд╛рд▓реА рддрд░реНрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореА рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░реА F рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рддреБрд▓рдирд╛ declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void; рдЬреЛ рдХрд┐ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдордЬрдмреВрдд рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #3246 рд▓реЙрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЖрдк рд╕рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░реА рдХреЗ рдЕрдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

@mhegazy рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдХреНрдпреЛрдВ рд╣реИ, рдХреНрдпрд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдХреЛ @F рдФрд░ @F() рдмрд░рд╛рдмрд░ рдмрдирд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрддрдГ рд╡реЗ рджреЛрдиреЛрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рдорд╛рди рдЖрд╣реНрд╡рд╛рди рд╣реИрдВ , рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдореЗрдВ рдмрд╛рд╣рд░реА рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдордВрддреНрд░рдг рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХрдо рд╕реЗ рдХрдо рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдлреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдкреАрдЖрдИ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рд╕рдЬрд╛рд╡рдЯреА рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ 2 рддрд░реАрдХреЗ рдХреНрдпреЛрдВ рд╣реИрдВред

рдЬрдмрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЬреЗрдПрд╕ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рдПрдХ рдЕрдВрддрд░ рд╣реИ (рдПрдХ рдореЗрдВ рдЖрдк рдПрдл рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░рд╛ рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЧреБрдЬрд░ рд░рд╣реЗ рд╣реИрдВ), рдореИрдВ рдирд╣реАрдВ рд╣реВрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рд┐рд░реНрдл рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ @F рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдПрдХ рдЦрд╛рд▓реА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рд╡рд╛рд▓реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ (рдФрд░ рдЖрд╣реНрд╡рд╛рди рдХрд░рддреЗ рд╣реИрдВ)?

рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдкрд╛рд╕ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдлреИрдХреНрдЯреНрд░реА рд╣реИ рдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ:

declare function decoratorOrFactory (...args: any[]): any;

рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИ рдпрд╛ рдлреИрдХреНрдЯреНрд░реА рд╣реИ, рдЗрд╕реЗ рдЦрд╛рд▓реА рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ?

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдХрд▓рдХ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреЗрдВред

@rbuckton рдореЗрдВ #3246 рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ рд╣реИ рдЬреЛ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрдиреЗ рд░рд╣реЗрдВред

@mhegazy , рдореИрдВ рдЬреЛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ (рдпрд╛рдиреА @F рдпрд╛ @F() ) рдХрд╛ рдЙрдкрдпреЛрдЧ _always_ рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди F рдХрд╛ рдЖрд╣реНрд╡рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдПрдХ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯрд┐рдВрдЧ рдлреИрдХреНрдЯреНрд░реА рдХреЗ рдмрд┐рдирд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдХреЛрдИ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рд╣реИред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ F рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣рдореЗрд╢рд╛ рд╣реЛрддрд╛ рд╣реИ:

declare function F(...args: any[]): ClassDecorator | PropertyDecorator | MethodDecorator | ParameterDecorator;

рдпрд╛ рдХреБрдЫ рд╕рдордХрдХреНрд╖ред

рдлрд┐рд░ рдЖрд╣реНрд╡рд╛рди @F рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ @F() рдХреЗ рдмрд░рд╛рдмрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ @F рдФрд░ @F() рджреЛрдиреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд░реВрдк рдореЗрдВ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд╕реЗ рдордВрдЧрд▓рд╛рдЪрд░рдг рднреНрд░рдо рдХреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ!

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП:

declare function F(...args: any[]): PropertyDecorator {
    return (target, name) => {
        // do stuff.
    }
}

@F()
property: number;

рддрдерд╛

declare function F(target, name) { // Matches PropertyDecorator
    // do stuff.
}

<strong i="22">@F</strong>
property: number;

рд╡реЗ рд╡рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛! рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдл рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рддрд╛рдХрд┐ рдпрд╣ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдореМрдЬреВрдж рд╣реЛ рд╕рдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЛрдЭрд┐рд▓ рд╣реИ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк рдпрд╛ рддреЛ рдпрд╣ рдЪреБрди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред

@Tharaxis рдЕрдЧрд░ рдореИрдВ F рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ @F рдФрд░ @F() рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдЬреИрд╕реЗ рдореИрдВ C рдФрд░ C() рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реЛрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ - рдкрд╣рд▓рд╛ рдПрдХ рдореВрд▓реНрдп рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реИред @F рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, @F() рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдПрдЧрд╛ред рд╡реЗ рдПрдХ рд╣реА рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

@ рдбреЗрд╡рд┐рдб рд╕рд╛рдЙрдерд░ рдХреНрдпрд╛ рдХреЛрдИ рд╡реИрдз рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? @F рдФрд░ @F() рдЖрд╣реНрд╡рд╛рди рдХреЗ рдмреАрдЪ рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИ, рдФрд░ рдпрд╣ рдЖрд╣реНрд╡рд╛рди рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

@F рдФрд░ @F() рдХреЗ рдЖрд╣реНрд╡рд╛рди рдХреЗ рдмреАрдЪ рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╡рд╛рдж рдХрд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИред F рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, F() рдПрдХ рдЦрд╛рд▓реА рддрд░реНрдХ рд╕реЗрдЯ (рдпрд╛рдиреА F.call(this, []) ) рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ F рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ; рдФрд░ рдпреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рдЪреАрдЬреЗрдВ рд╣реИрдВред

@Tharaxis @F рдФрд░ @F() рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реИрдВред рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдЕрдВрддрд░ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдЖрд╣реНрд╡рд╛рди рдореЗрдВ рдЕрдВрддрд░ рд╣реИ рдЬреЛ рдХрд┐ рдирд┐рддрд╛рдВрдд рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкреВрдЫрддрд╛ рд╣реВрдВ: рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

@mhegazy рдЬрдмрдХрд┐ рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╡рд┐рдХрд▓реНрдк ( @F() ) рдЕрд▓рдЧ-рдЕрд▓рдЧ (рдФрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ) рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ @F рдЖрдордВрддреНрд░рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдмрдВрдж рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рдХреА рдкреАрдврд╝реА рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рдЭрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдХреЗ рд╡рд┐рд░реБрджреНрдз рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд▓рдЧрд╛рд╡ "рд╕реБрд░рдХреНрд╖рд┐рдд" рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рдЖрд╢реНрдЪрд░реНрдп рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред

@ рдбреЗрд╡рд┐рдб рд╕рд╛рдЙрдерд░ рдЖрдкрдХрд╛ рдкреНрд░рд╢реНрди рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ:

declare function F(): PropertyDecorator {
    return (target, name) => {
        // do stuff
    }
}

рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдХрдо рдЖрдХреНрд░рд╛рдордХ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рд╕рд░рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕" рд╕реЗ рдХреЗрд╡рд▓ 2 рд▓рд╛рдЗрдиреЗрдВ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд▓рдмреНрдз рд╕рдЬрд╛рд╡рдЯреА рдЖрдордВрддреНрд░рдг рдХреНрдпрд╛ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЪреВрдВрдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ (рдФрд░ рд╣рдореЗрдВ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЫреВрдЯ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП), рдЖрдкрдХреЛ "рд╕рд░рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рд╡реНрд╣рд┐рдк рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 2 рд╕реЗрдХрдВрдб рдХрд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдХ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

declare function F(options?: any): PropertyDecorator {
    return (target, name) => {
        // do stuff
    }
}

@F()
property1: number;

<strong i="15">@F</strong>
property2: number;

@F({ option: true })
property3: number;

рдЗрдирдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдПрдХ рдЬреИрд╕реА рдирд╣реАрдВ рд╣реИрдВред @F рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдЕрдВрдХрд┐рдд рдореВрд▓реНрдп рдкрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рд░рдЦреЗрдВ, рджрд┐рдЦрд╛рд╡рд╛ рдХрд░реЗрдВ рдХрд┐ рдореИрдВ рдХреЛрдИ рдРрд╕рд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реВрдВ рдЬрд┐рд╕реЗ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ F рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдШреЛрд╖рдгрд╛ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдмрд╕ рдпрд╣ рдЬрд╛рди рд▓реЗрдВ рдХрд┐ F рдореМрдЬреВрдж рд╣реИ рдФрд░ рдпрд╣ рддрд░реНрдХреЛрдВ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ @F рд╕рд╛рде рдЧрд▓рддреА рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдореМрдЬреВрджрд╛ рддрдВрддреНрд░ рдХреЗ рддрд╣рдд рдорд╛рдореВрд▓реА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░/рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рдХрд░реНрддрд╛ рдкрд░ рдПрдХ рдмрдбрд╝рд╛ рджрд╛рдпрд┐рддреНрд╡ рдбрд╛рд▓рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ @F рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж @C рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ "рдЕрд▓рдЧ" рд╣реИ)ред

рдЕрдЧрд░ рдореБрдЭреЗ "рдПрдХ рдЖрдХрд╛рд░ рд╕рднреА рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ" рдбреЗрдХреЛрд░реЗрдЯрд░ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рдпрд╣ рднрдпрд╛рдирдХ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

declare function F(...args: any[]): any {
    var decorator = (target, name) => {
        // do stuff
    }

    // Heaven forbid your decorator formal parameter list also can take 2 parameters.
    return (args.length === 2) ? decorator(args[0], args[1]) : decorator;
}

рдЬреЛ рдХрд┐ рдХрд╛рдлреА рднрдпрд╛рд╡рд╣ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдл рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рднреА рдореВрд▓реНрдпрд╡рд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рдЦреЛ рджреЗрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред

рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдФрд░ рд╕реБрд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рдореЗрдВ рдореВрд░реНрдЦрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкрд╛рд╕ рдЙрд╕реА рддрд░рд╣ рдХреА рд╕рдордЭ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдпрд╛ рд╕рдордЭ рд╣реЛрдЧреА рдЬреЛ рдЙрд╕ рдХреЛрдб рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИрдВред

@ рдерд╛рд░реИрдХреНрд╕рд┐рд╕ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛, рдФрд░ рдореИрдВ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ @mhegazy рдФрд░ @DavidSouther рдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рдпрд╛рд╕ рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░реА рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдореЗрд╢рд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдХреЛ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд▓рд┐рдВрдЯрд░ рдХреЛ рдЖрдкреВрд░реНрддрд┐ рдирд┐рдпрдоред

рд╕рд╛рде рд╣реА, рдореИрдВрдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдореЗрдВ рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрдкрдХреЗ рдкрд╣рд▓реЗ рдХреЗ рдмрд┐рдВрджреБ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ #3249 рдЬрдорд╛ рдХрд┐рдпрд╛ рд╣реИред

рд╣рд╛рдп @rbuckton ,

рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реВрдВ рдЬреЛ @Tharaxis рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЗрддрдиреЗ рдЬрд╛рдирдХрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИрдВ ...

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдкреНрд░рд╢реНрди рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛рдиреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, this.f рдмрдирд╛рдо this.f() рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рдореБрдЭреЗ рдореВрд▓реНрдп рдЪрд╛рд╣рд┐рдП, рдХрднреА-рдХрднреА рдореБрдЭреЗ рд╡рд╣ рдЪреАрдЬрд╝ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдореВрд▓реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред

рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рд╕реНрддрд░ рдкрд░ рдореЗрд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдпрд╣ рддрд░реНрдХ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдбреЗрдХреЛрд░реЗрдЯрд░ @F рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛

рдореЗрд░реА рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ рдЕрдЧрд░ рдЙрдкрд░реЛрдХреНрдд рдЧрд▓рдд рдпрд╛ рдЕрдЬреНрдЮрд╛рдиреА рд╣реИ, рддреЛ рдореИрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдпрд╛ рд╣реВрдВред

рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдЪреАрдпрд░реНрд╕

рдореБрдЭреЗ рдпрд╣ рдкреНрд░рд╢реНрди рднреА рдкреВрдЫрдирд╛ рд╣реИ - рдХреНрдпрд╛ рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд╕рдорд╛рдирддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ _if_ (рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░) "рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ" рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЗрд╡рд▓ _happen_ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред

рдЕрднреА рдпрд╣ рддрдереНрдп рдХрд┐ @F рдФрд░ @F() рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ:

  • рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ @F рдФрд░ @F() рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ @F рдмрдирд╛рдо @F() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ declare function A(params?: any): ParameterDecorator рдмрдирд╛рдо declare function B(target, name) , @A рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди @A() рд╣реЛрдЧрд╛, @B рдХрд╛рдо рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди @B() рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рднреА рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╡реЗ рдПрдХ рд╣реА рдЪреАрдЬ рд╣реИрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдПрдХ рдЖрд╡реЗрджрди)ред
  • рдХреЛрдб рд╕реНрддрд░ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдареЛрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЖрдордВрддреНрд░рдг рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред
  • рдпрджрд┐ рдЖрдкрдиреЗ 'рд░реЙ рдбреЗрдХреЛрд░реЗрдЯрд░' ( @F ) рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдЕрдм рдЖрдк рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдПрдВ) рддреЛ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реИред рд╡рд░реНрддрдорд╛рди рдкрджреНрдзрддрд┐ рдХреЗ рддрд╣рдд, рд╡реЗ рд╕рднреА @F рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдм @F() рдкреБрди: рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдХреБрдЫ рдХреЛрдб рдХреЗ рднреАрддрд░ рдЬрд┐рдирдХреА рдЖрдкрдХреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ - рдЬрдмрдХрд┐ рдирд┐рд╣рд┐рдд рдЖрд╣реНрд╡рд╛рди рдЖрдкрдХреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдмрджрд▓реЗрдВред

@ рдерд╛рд░реИрдХреНрд╕рд┐рд╕ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ @F рдФрд░ @F() рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдкрд░ рдПрдХ рдЙрдЪреНрдЪ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдмреЛрдЭ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХреЛрдб, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рддрд╛рдХрд┐ рджреЛрдиреЛрдВ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВред рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП ES7 рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рджреЛ рд░реВрдкреЛрдВ рдХреЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рд╡рд┐рдЪрд▓рди рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рднреНрд░рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рднреНрд░рдо рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдерд╛

function callbackFactory() {
     return function(...args: any[]) { // do stuff };
}
function takesCallback(cb: (...args: any[]) => void) { }
takesCallback(callbackFactory());

рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ takesCallback(callbackFactory) рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ callbackFactory рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреНрд░рдо рдХреА рддрд░рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрддрд╛рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рднрд╛рд╖рд╛ рдиреЗ рдЗрди рджреЛ рд░реВрдкреЛрдВ рдХреЛ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛, рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХрдореА рдЖрдПрдЧреАред рдХрднреА-рдХрднреА рднреЗрдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@JsonFreeman рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХрд╛ рддрд░реНрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдЕрдкрдиреА рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ ES7 рдкреНрд░рд╕реНрддрд╛рд╡ рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдд рд╣реИ, ES7 рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрд╕ рдпрд╣реА рд╣реИрдВ, рдПрдХ _рдкреНрд░рд╕реНрддрд╛рд╡_, рдФрд░ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд╡реЗ ' рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ Google рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░реНрдп рдХреЗ рд╕рдВрдпреЛрдЬрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рд╣реИ рдирд╛? рдЕрднреА рддрдХ рдХреБрдЫ рднреА рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдиреБрдореЛрджрди рд╕реЗ рдкрд╣рд▓реЗ _many_ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╕реЗ рдЧреБрдЬрд░реЗрдЧрд╛, рддреЛ рдХреНрдпреЛрдВ рди рдЙрдиреНрд╣реЗрдВ рдЯреАрдПрд╕ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдлрд┐рд░ (рдХрдо рд╕реЗ рдХрдо рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреАрдПрд╕ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЕрдиреБрднрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рдЪрд╛рд░ рдХреЗ рдкреАрдЫреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╡рд┐рднрд┐рдиреНрди рдкрдХреНрд╖? рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм TS рдиреЗ рдХреЗрд╡рд▓ рдмрд╛рдж рдореЗрдВ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд▓рд╛рдЧреВ рдХреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ES6 рдпреБрдХреНрддрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рддрдм рддрдХ _рд╣рдореЗрд╢рд╛_ рд╣реЛрдЧреА рдЬрдм рддрдХ рдЖрдк рдХрд┐рд╕реА рдРрд╕реА рдпреБрдХреНрддрд┐ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЯреНрд░реИрдХрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдЬрд┐рд╕ рдкрд░ рдЕрднреА рддрдХ рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рдмрдиреА рд╣реИред

рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдлрд┐рд░ рд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдирд┐рд░реНрдорд╛рдг рд╣реИрдВред рдЬрдм рдореИрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ (рдФрд░ рдЬрдм рдореИрдВ рдПрдХ рдмрдирд╛рдо рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ) - рдФрд░ рдЬрдм рдореИрдВ рдХреБрдЫ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рднреНрд░рдо рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдбреЗрдХреЛрд░реЗрдЯрд░ _not_ рдлрдВрдХреНрд╢рди рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрдВрдХреНрд╢рди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрдВрдХреНрд╢рди рдХреЗрд╡рд▓ рд╡рд╣ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд╣рдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдХрд╛рд░реНрдп рд╣реИрдВ, рдЬреЛ рдХрд┐ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рд╡рд╣ рддрд░реАрдХрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо ES6 рд╕реЗ рдкрд╣рд▓реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдзрд┐ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдереАред рдХрдХреНрд╖рд╛рдПрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдирд╣реАрдВ рд▓реЗрддреА рд╣реИрдВ, рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдиреНрд╣реЗрдВ ES6 рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдлрд┐рд░ рднреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдкрдиреЗ рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдореБрдЭреЗ рдмрд╕ рдкрд╕рдВрдж рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдб рдореЗрдВ рдореИрдВ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреА рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдБрдЧрд╛ред рдореЗрд░рд╛ рдЕрдм рднреА рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдореИрдВ рд╣реВрдВред

@mhegazy рдпрд╣ рд╡рд╣реА рдореБрджреНрджрд╛ рдореИрдВ рдпрд╣рд╛рдБ @jonathandturner рдбреЗрдХреЛрд░реЗрдЯрд░ рд░реЗрдкреЛ рдкрд░ рд▓рд╛рдпрд╛ рд╣реИ: https://github.com/jonathandturner/decorators/issues/16 рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рдХрд░ рдХреБрдЫ рд╣реИ рдХрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЦрдбрд╝рд╛ рд╣реИ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдХрдИ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХрд╛ рд╡рд┐рд╖рдп рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рд╢реАрд░реНрд╖рдХ "ES7 рдбреЗрдХреЛрд░реЗрдЯрд░ рдиреБрдХрд╕рд╛рди" рднреА рд╣реИред

@ рдерд╛рд░реИрдХреНрд╕рд┐рд╕ , рдореИрдВ рдЖрдкрдХреЗ рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ ES7 рдкреНрд░рд╕реНрддрд╛рд╡ рд╣рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдорд╛рд░рд╛ рдбрд┐рдЬрд╛рдЗрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ES7 рдХреЗ рдЕрдЧреНрд░рджреВрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдЬрд╣рд╛рдБ рддрдХ "рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛рд░реНрдп рддрд░реНрдХ рдирд╣реАрдВ рд╣реИрдВ" рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдБ, рддреЛ рд╣рдо рд╕реНрд╡рдпрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рд╕рдЬрд╛рд╡рдЯреА рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдХрд┐рд╕реА рднреА рднреЗрдж рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдЬрд╛рд╡рдЯреА _factories_ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рд╣реИрдВред рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░реА рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдлрдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрднреЛрдХреНрддрд╛ рдЗрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдмрд╕ рдЗрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдорд╛рдирдХрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@JsonFreeman рддрд░реНрдХ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдШреВрдорддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдЙрд╕реЗ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рдПрдХ рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдФрд░ рдлрд┐рд░ рдПрдХ "рд░реЙ" рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ (рдЬреЛ рдлрд╝реИрдХреНрдЯрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд╝реИрдХреНрдЯрд░реА рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ) ), рдФрд░ рд╕рд╡рд╛рд▓ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдерд╛ рдХрд┐ "рдХреНрдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХреНрдпрд╛ рдХрд╛рд░рдЦрд╛рдиреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП"ред

рдореИрдВ рдЬреЛ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣рд╛рдВ рд╣реИ, рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдВрдкрд╛рдЗрд▓рд░ @F рдХреЛ @F() рдХреЙрд▓ рдХреЗ рдмрд░рд╛рдмрд░ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП 0 рдХреА рддрд░реНрдХ рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ... рдПрди рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдЦрдВрдб рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ред рд╢рд╛рдпрдж рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "... рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░реА рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ ...", рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрддрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣рдореЗрд╢рд╛ рдХрд╛рд░рдЦрд╛рдиреЗ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдирд╛рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдирд╛рдо рд╣реИ ... рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ?

рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ рдХрд┐ рд╕рднреА рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░реЗрдВ, рдЖрдк <decorator name>(<argument list>)(target, name) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╕ <decorator name>(target, name) рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рдкреВрд░реНрд╡ рдЙрджрд╛рд╣рд░рдг рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬрдмрдХрд┐ рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдХрднреА-рдХрднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рд╕рд┐рд░рджрд░реНрдж рдмрд╕ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдореБрдЭреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реЛрдиреЗ рд╕реЗ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдореБрджреНрджреЗ рд╣реЛрддреЗ рд╣реИрдВред рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ рдЙрди рджреЛ рддрд░реАрдХреЛрдВ рдХрд╛ рднреА рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдЖрд╣реНрд╡рд╛рди рдХрд╛ рддрд░реАрдХрд╛ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдЕрд╕рдорд╛рдирддрд╛ рд╣реИ рдЬреЛ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рд╕реЗ рд▓реЗрдХрд░ рднрд╛рд╖рд╛ рдХреА рд╕реНрдерд┐рд░рддрд╛ рддрдХ рд╕рдм рдХреБрдЫ рдмрд╛рдзрд┐рдд рдХрд░рддреА рд╣реИред

рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдХреБрдЫ рдкрджреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкрджреНрдзрддрд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

рд╣рд╛рдп рд╕рдм, @Tharaxis рдиреЗ рдЬреЛ рдХрд╣рд╛ рд╣реИ,

рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА рдпрджрд┐:
рдП) рдмреНрд░рд╣реНрдорд╛рдВрдб рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдмреА) рдЕрдЧрд░ рдЪреАрдЬреЗрдВ рдЕрд▓рдЧ рдереАрдВ рддреЛ рд╕рдЬрд╛рд╡рдЯреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЦреЛ рджреЗрдВрдЧреЗред

рдмрд╛рдж рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдореВрд▓реНрдп рдирд┐рд░реНрдгрдп рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрддреНрддрд░ рдХреБрдЫ рд╣рдж рддрдХ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрд╡рд▓рдкрд░ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрджрд┐)ред рдореИрдВ рдкреВрд░реНрд╡ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣реВрдВ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдврд╛рдВрдЪреЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдлреИрд▓рд╛ рд╣реБрдЖ рд╣реВрдВред рддреЛ рдореЗрд░реЗ рд▓рд┐рдП 'рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдорддрд╛рдУрдВ' рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЪреАрд▓рд╛рдкрди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ рддреЛ рд╕рднреА рдЯреНрд░реЗрдбрдСрдлрд╝ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реЛрдВрдЧреЗред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ @F рдФрд░ @F() рд╕рдЬрд╛рд╡рдЯреА рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдП рдмрд┐рдирд╛ рд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдирд╣реАрдВ рддреЛ рдореИрдВ рдШрд╛рд╕ рдореЗрдВ рд░реЗрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдЬрд╛рд╡рдЯреА рд▓рд┐рдЦрддреЗ рд╕рдордп рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬрдм рднреА рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдЪреАрдпрд░реНрд╕

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрд░реЛрдз рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЯрд┐рдХрд╛ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╣рд┐рдд рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрдЪреНрдЪреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдореИрдВ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ F рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди @F рдХреЛ @F() рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдл рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдл рдХреЗ рдмрдЬрд╛рдп рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░реА рдХреЗ рдмрдЬрд╛рдп рд░реЙ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рддреЛ рд╣рдо рдХрд╣реАрдВ рддреНрд░реБрдЯрд┐ рджреЗрддреЗ рд╣реИрдВ?

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЙрд▓рдЯ рджреЗрдЧрд╛ред рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣рд╛рдБ рдЖрджрд┐рдо рдирд┐рд░реНрдорд╛рдг рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдКрдкрд░ рдирд┐рд░реНрдорд┐рдд рдЕрдореВрд░реНрддрддрд╛ рдХреА рдПрдХ рдкрд░рдд рд╣реЛрддреЗ рд╣реИрдВред рд╡реЗ рд╕рд┐рд░реНрдл рдПрдХ рдкреИрдЯрд░реНрди рд╣реИрдВ, рдЗрд╕рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВред рдпрджрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдбреЗрдХреЛрд░реЗрдЯрд░ рдлреИрдХреНрдЯреНрд░реА рд╡рд┐рд╣рд┐рдд рдЪреАрдЬ, рдЖрджрд┐рдо рдмрди рдЬрд╛рддреА рд╣реИ, рддреЛ рд▓реЛрдЧ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдлреНрд▓реИрдЯ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧрдиреЗ рд▓рдЧреЗрдЧрд╛, рдФрд░ рдпрд╣ рдЙрд╕ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХреЛ рдЙрд▓рдЯ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдЪреАрдЬ рдЬреЛ рдореИрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рд╣реВрдВ, рд╡рд╣ рд╣реИ рдЬрд╛рджреВ рдХреА рдЕрдзрд┐рдХрддрд╛ред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдШрдмрд░рд╛ рдЬрд╛рддрд╛ рд╣реВрдВ рдЬрдм рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдХреЛрдб рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╕рдВрдХрд▓рдХ рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдордВрддреНрд░рдг рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реВрдбреВ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рд╣рд╛рдп @JsonFreeman ,

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрдЬрд╛рдп рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рд╕рд╛рде рдХреБрд░реВрдкрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрд┐рдирд╛ рддрд░реНрдХ рд╡рд╛рд▓реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд╕реВрд░рдд рд╣реИрдВред рдХреНрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

// wraps rawDecoratorMethod in a no-arg factory method.
<strong i="8">@Decorator</strong>
function rawDecoroatorMethod(target, name, descriptor) {...}
// looks like this one would be a no-op... so that feels not quite right unless there's other advantages.
<strong i="11">@DecoratorFactory</strong>
function decoroatorFactoryMethod(someArg) {...}

рд╡реИрд╕реЗ рднреА, рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдПрдиреЛрдЯреЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рд╕рдЬрд╛рддрд╛ рд╣реИред

рдЪрд┐рдпрд░реНрд╕

рдЕрдЪреНрдЫреА рдЧреНрд░реЗрд╡реА, рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрд╕реЗрдкреНрд╢рди рдХрд╛ рдПрдХ рдЧрдВрднреАрд░ рдорд╛рдорд▓рд╛ред

@JsonFreeman рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╢реВрдиреНрдп-рдкрд░рдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдкрд░ (рд▓рдХреНрд╖реНрдп, рдирд╛рдо) рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рднреАрдбрд╝ рд╣реЛрдиреЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдмрджрд╕реВрд░рдд рд╣реИрдВред рдпрджрд┐ рдХреБрдЫ рднреА рдХрдо рд╕реЗ рдХрдо рд╢реВрдиреНрдп-рдкрд░рдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛/рд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рд╕реНрддрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдХреА рдХрдореА рд╣реЛрддреА рд╣реИ (рдЪреВрдВрдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдордВрддреНрд░рдг рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ), рдФрд░ рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдПрдХ рд╣реА рд▓рдХреНрд╖реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реНрддрд░ рдХреА рдЕрд╕рдВрдЧрддрд┐ред рдореБрдЭреЗ рдПрдХ рдХрдерд┐рдд "рд╕рдВрднрд╛рд╡рд┐рдд" рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рдХрд┐рд╕реА рдПрдХ рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЕрдирд┐рдЪреНрдЫрд╛ рднреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдмрд╣реБрдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ "рд╕реНрдкрд╖реНрдЯ" рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦрдкрдд рдкрдХреНрд╖ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдХрд┐рд╕реА рдХреЛ рдкрдХреНрд╖ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЧрд▓рддреА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рд╕рдВрднрд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯред

рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЬрд┐рдиреНрд╣реЗрдВ @F рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реЗ ClassDecorator, MethodDecorator, PropertyDecorator рдпрд╛ ParameterDecorator рдХреЗ рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдпрд╛ рдПрдХ 0..n arg рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди рдЬреЛ ClassDecorator, MethodDecorator, PropertyDecorator рджреЗрддрд╛ рд╣реИ рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ (рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рдХрд╛рд░реНрдп рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрднрд╡ рдорд┐рд▓рд╛рди рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛?) рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рднреАрддрд░ рдХреЗрд╡рд▓ рдЕрдиреБрдЪрд┐рдд рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдмрд╕ @F рдХреЙрд▓ рдХреЛ @F() рдХрдирд╡рд░реНрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ рдФрд░ рдмрддрд╛рдИ рдЧрдИ рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдЬрдЯрд┐рд▓ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдЬрд╛рд╡рдЯреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реИред рд╕рдореНрдорд┐рд▓рд┐рдд рдЖрдордВрддреНрд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрджреГрд╢реНрдп рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЦрдбрд╝рд╛ рд╣реИ рд╡рд╣ рдЬрдЯрд┐рд▓ рднреА рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдпрд╛ рдЗрдЪреНрдЫрд╛рдзрд╛рд░реА рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХрд┐ рдореИрдВ рддреБрдореНрд╣реЗрдВ рдЕрдиреБрджрд╛рди рджреВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдЧрд╛ред

рдЖрдк рдЬрд┐рд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдордВрддреНрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддрдм рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдмрдЬрд╛рдп рдордирдорд╛рдиреА рд╕рдЬрд╛рд╡рдЯреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рднреА рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдХрд┐ рдЬрдм рддрдХ рдЕрдиреНрдпрдерд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд┐рд╣рд┐рдд рдЖрдордВрддреНрд░рдг рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕реА # рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдордирдорд╛рдирд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдЕрдЪреНрдЫреА рдЧреНрд░реЗрд╡реА, рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрд╕реЗрдкреНрд╢рди рдХрд╛ рдПрдХ рдЧрдВрднреАрд░ рдорд╛рдорд▓рд╛ред

рдЙрдЪрд┐рдд рдХреЙрд▓ред рдПрдХ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рджреЛрдкрд╣рд░ рдореЗрдВ рджреЗрд░ рд╕реЗ рдПрдХ рдЦрд░рд╛рдм рд╕реЛрдЪреА-рд╕рдордЭреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд╕рд╣реА рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕реАрдЦрд╛ рдЧрдпрд╛ рд╕рдмрдХред рдЗрдВрдЯрд░рдиреЗрдЯред рдкреВрд░реНрд╡рд╡рдд рдХрд░реЗрдВ ()ред

рдореЗрд░рд╛ рдХрд╣рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд▓рдЧрд╛рддрд╛рд░ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдЦреБрд╢ рд╣реВрдВред рдореИрдВ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдмреЙрдпрд▓рд░ рдкреНрд▓реЗрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦреВрдВрдЧрд╛ред рдлрд┐рд░ рд╕реЗ рдореИрдВ рдереЛрдбрд╝рд╛ рджрд░реНрдж рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬрдм рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рджрд░реНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ (рдпрджреНрдпрдкрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рджрд░реНрдж)ред рджреВрд╕рд░реЗ рдЕрд╕рд╣рдордд рд╣реЛрдВрдЧреЗред

рдХреНрдпрд╛ рдПрдкреАрдЖрдИ рдПрдиреНрд╣рд╛рдВрд╕рдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рднреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ? рдлреИрдХреНрдЯреНрд░реА рдХреЗ рдмрд┐рдирд╛ рдмрдирд╛рдП рдЧрдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ @F рдФрд░ @F2() рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ f рдФрд░ f() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдпрд╣ рдкрд░рд┐рджреГрд╢реНрдп рдорд┐рд▓реЗрдЧрд╛, рд╡реЗ рдЙрдкрднреЛрдЧ рдкрдХреНрд╖ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВред рдбреЗрдХреЛрд░реЗрдЯрд░ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рд╣рдореЗрд╢рд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд▓рдХреНрд╖реНрдп рдкрд░ рд▓рд╛рдЧреВ/рдЖрд╣реНрд╡рд╛рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рджреГрд╢реНрдпреЛрдВ рдХреЗ рдкреАрдЫреЗ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рдзрд┐ рдЖрдордВрддреНрд░рдг рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреНрд░реВрдХреНрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореБрджреНрджрд╛ рд╣реИ, рдЬрдм рдореИрдВ рдПрдХ рд╕рдЬрд╛рд╡рдЯреА рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП Google рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд▓реЗрдЦрдХ рдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ - рдореБрдЭреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдкреИрдХреЗрдЬрд┐рдВрдЧ рдирд╣реАрдВред

рдЪрд┐рдпрд░реНрд╕

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдЕрдВрддрд┐рдо рдиреЛрдЯ рдФрд░ рдлрд┐рд░ рдореИрдВ рдЪреБрдк рд░рд╣реВрдВрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдбрд┐рдЬрд╝рд╛рдЗрди рдореБрджреНрджрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рд╣рд░ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ, рди рдХрд┐ рджреВрд╕рд░реА рддрд░рдлред

рдпреВрдЖрдИ/рдпреВрдПрдХреНрд╕ рд▓рдбрд╝рдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рджреЗрдЦрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдкреНрд░рддрд┐рднрд╛рд╢рд╛рд▓реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдпреВрдЖрдИ рд╕рдорд╛рдзрд╛рди рд╕реБрдЭрд╛рдП рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЪреЛрдЯ рдкрд╣реБрдВрдЪрд╛рдПрдВрдЧреЗ (рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдирджреЗрди рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рджреЛ рд╕реЗрд╡ рдмрдЯрди рдереЗ - рдлрд┐рд░ рд╕реЗ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рд▓рдбрд╝рдХрд╛ рдФрд░ рдЕрдЪреНрдЫрд╛ рдЗрдВрд╕рд╛рди)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рддрд░реНрдХ рдореЗрдВ рдШреБрдЯрдиреЗ рдЯреЗрдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЬреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЙрд╕реЗ рднреВрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдФрд╕рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрдВрдЦреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рдЕрдЧрд░ рдФрд╕рдд рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рд╕рд┐рд░реНрдл рд╕рд╛рджрд╛ рдЧрд▓рдд рд╣реВрдВ, рдпрд╛ рдпрджрд┐ рдЬрдЯрд┐рд▓рддрд╛ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░рддреА рд╣реИ рддреЛ рд╕рдм рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдмрд╕ рдЕрдкрдирд╛ рджрд┐рдорд╛рдЧ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдЪрд┐рдпрд░реНрд╕

рдпрджрд┐ рдЖрдкрдХрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдерд╛ред OR-ed рдлрд╝реЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╡реНрдпрдВрдЬрдХ рдХреЗ рд╕рд╛рдеред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

@(F || function (target) { // default decorator behavior })
class C { }

рдХреНрдпрд╛ рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣ рдЖрдкрдХреЛ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ:

(F || function (target) { // default decorator behavior })()

рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ред

@JsonFreeman , рдХреНрдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕ рддрд░рд╣ рдХреА рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ? рдореИрдВ 100% рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрддрдиреА рд░рд╕реНрд╕реА рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рд▓рдЯрдХрд╛ рджреЗрдирд╛ рдЬрд░реВрд░реА рд╣реИ, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдореБрдЭреЗ рд╣реИ (рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдкреБрди: рдЙрдкрдпреЛрдЧ/рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рд▓рдХреНрд╖реНрдп рд╣реИ рд╣рд▓ рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреЛ рдмрджрд╕реВрд░рдд рдФрд░ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдореЗрдВ рдФрд░ рднреА рдХрдард┐рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдВ)ред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрд╡рдпрдВ рдЙрд╕реА рдлреИрдХреНрдЯреНрд░реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП:

@(F || () => function(target) { /* default decorator behaviour */ })
class C { }

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдордирдорд╛рдирд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ рдФрд░ рдлрд┐рдЬреВрд▓рдЦрд░реНрдЪреА рдХрд░рдиреЗ рдкрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ () => рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

рдиреЛрдЯ: рдореЗрд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдорддрд▓рдм рдирд╣реАрдВ рдерд╛ рдХрд┐ рд▓реИрдореНрдмреНрдбрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди () => рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ function() { return function(target) { /*...*/ } } ред

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдбрд┐рдмреЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЙрд╕ рдСрд░реНрдбрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд╛рд░ рдХреА рддрд░реНрдЬ рдкрд░, рдореВрд▓ рд╕реНрд░реЛрдд рдореЗрдВ рд▓рдХреНрд╖реНрдп рд╕рджрд╕реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдПрдХ рд▓рдХреНрд╖реНрдп рдкрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдХреНрд░рдоред

@billccn рдбреЗрдХреЛрд░реЗрдЯрд░ рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ

class C {
    <strong i="7">@F</strong>
    <strong i="8">@G</strong>
    method() { }
}

рдпрд╣ рдкрд╣рд▓реЗ G рдХреЛ рд╡рд┐рдзрд┐ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ F рдХреЛ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдХреНрдпрд╛ рдЖрдк рдпрд╣реА рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ?

рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ:

<strong i="6">@A</strong>
class Clazz {
    <strong i="7">@B</strong>
    prop = 1;

    <strong i="8">@C</strong>
    method() {}

    <strong i="9">@D</strong>
    get prop() {return 1;}

    <strong i="10">@E</strong>
    method2() {}

    <strong i="11">@F</strong>
    prop2 = 1;
}

рд╡реЗ рд╕реНрдХреЛрдк рдСрд░реНрдбрд░ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЧреБрдг/рд╡рд┐рдзрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рдШреЛрд╖рдгрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ, рдлрд┐рд░ рдХрдХреНрд╖рд╛ рдПрдХред рдпрд╛рдиреА рдмреА, рд╕реА, рдбреА, рдИ, рдПрдл, рдПред

рдЖрдк рдпрд╣рд╛рдВ рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдЧреБрдгреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдкреИрд░рд╛рдореАрдЯрд░ рдЧреБрдг constructor(private prop: Type) рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ (рдлрд╝реАрд▓реНрдб) рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдХреЛ рд╕рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдХрд▓реНрдкрдирд╛рд╢реАрд▓ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд▓реЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдердб рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ...

var isCreatorUser = () => {  /* code that verifies if user is the creator */ },
    isAdminUser = () => { /* code that verifies if user is admin */ },

var routeConfig = {
    get() {},
    <strong i="7">@isCreatorUser</strong> patch() {},
    <strong i="8">@isAdminUser</strong> <strong i="9">@isCreatorUser</strong> delete() {}
};

... рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпреЛрдВ? рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдЕрднреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред @rbuckton рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдХреНрдпрд╛ рдореИрдВ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рдЬрд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдЬрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдердбрдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

declare type MethodDecorator = <T, R>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<R> | void;

рддреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдореИрдХреНрд░реЛ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдбреЗрдХреЛрд░реЗрдЯреЗрдб рдХреНрд▓рд╛рд╕ / рдлреАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдЯрд╛рдЗрдк рдХреЗ рдЕрдиреБрд░реВрдк рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЯрд╛рдЗрдк рд╕реЗрдлреНрдЯреА рдмрдиреА рд░рд╣реЗред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ https://github.com/jonathandturner/brainstorming/blob/master/README.md#c4 -defining-a-decorator рдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди type validity рдпрд╣рд╛рдВ рд╡реИрдз рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдЖрдИрдПрдордПрдЪрдУред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╡рд░реНрдЧ/рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЯреАрдПрд╕ рдФрд░ рдЬреЗрдПрд╕ рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реЗ, рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЯреАрдПрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рд╛рдЗрдЯ рдкрд░ рдореВрд▓ рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯреЗрдб рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@HerringtonDarkholme рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реБрдЭрд╛рд╡ рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рд░рдг рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рдпрд╣ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рдорд┐рд╢реНрд░рдг рдореЗрдВ рдЯрд╛рдЗрдк рдореНрдпреВрдЯреЗрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдШреЛрд╖рдгрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдмрд╛рд▓реЛрдВ рд╡рд╛рд▓реА рд╣реЛ рд╕рдХрддреА рд╣реИред

@mhegazy рддреЛ, рдХреНрдпрд╛ рдореИрдВ рдЗрд╕реЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордЭреМрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ?

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдбреЗрдХреЛрд░реЗрдЯрд░ рдбрд┐рдХреНрд▓реЗрд░реЗрдЯрд┐рд╡ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдбрд┐рдЬрд╛рдЗрди рд╕рдордп рдкрд░ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реЛрдЧрд╛:
рднрд╡рд┐рд╖реНрдп рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЬ рдХреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдПрдХ рджрд┐рди рдЯреАрдПрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣реИ рдирд╛?)

function SafeCtor(target) {
  var safe = function(...args) {
    var instance = Object.create(target.prototype)
    target.call(instance, ...args)
    return instance
  }
  safe.prototype = target.prototype
  return safe
}

<strong i="10">@SafeCtor</strong>
class Snake {
  constructor(name) {
    this.name = name
  } 
}

var snake = Snake('python')
alert(snake instanceof Snake)

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ structural рдмрдирд╛рдо nominal рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЬреИрд╕реА рдХрд╣рд╛рдиреА рдирд╣реАрдВ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдЬрд╛рдВрдЪ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд▓рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдЖрдмрдВрдЯрд┐рдд рд╣реИред рд▓рд╛рдкрддрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрдзрди рдХреЛ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рд╕реБрдЭрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдИ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рд╕реНрд░реЛрдд рдореЗрдВ рд╕рдЬрд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдпрд╛ рдХрд┐рд╕реА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ рд▓рдХреНрд╖реНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдФрд░ рдЯрд╛рд░рдЧреЗрдЯ рдХреЛ рдПрдХ рдорд┐рдХреНрд╕рд┐рди рдХреА рддрд░рд╣ рдорд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрд╕ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд┐рдЪрд╛рд░ред рдЪреВрдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдЙрдЯрдкреБрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд╛рди рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ, рдЬреИрд╕реЗ Xtend

рдЖрдк рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред рд╕рдХреНрд░рд┐рдп рдПрдиреЛрдЯреЗрд╢рди рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ "рд╕рдХреНрд░рд┐рдп рдПрдиреЛрдЯреЗрд╢рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ Xtend рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдЕрдиреБрд╡рд╛рдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ"

рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреА!

рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░, рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@shumy рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореЗрдердб рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░реЙрдкрд░реНрдЯреА рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ? (рдмреЗрдмреЗрд▓ рдирд╣реАрдВ рдХрд░рддрд╛)ред

рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐, рдЕрдЧрд░ рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

function decorator(proto, name) {
    Object.defineProperty(proto, name, { value: 42 });
}

class Foo {
    <strong i="7">@decorator</strong>
    a: number;
}

рдЬрдмрдХрд┐ рдмрд╛рдмреЗрд▓ рдХреЛ рд╡рд┐рд╡рд░рдгрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

function decorator(proto, name) {
    return { value: 42 };
}

class Foo {
    <strong i="11">@decorator</strong>
    a;
}

рдЗрд╕рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреИрдмреЗрд▓ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдПрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдореЗрдердб рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╕рдорд╛рди рдорд╛рдирд╛ рдЬрд╛рдП, рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ Object.defineProperty рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣, рдПрдХ рд╣реА рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдХрдИ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЕрднреА рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб (рдмреЗрдмреЗрд▓ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП) рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдмреЗрдХрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ:

function decorator(proto, name) {
    var d = { value: 42 };
    Object.defineProperty(proto, name, d);
    return d;
}

@mhegazy рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдХреЛрдИ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реЛрдЧреА?

@sccolbert рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣рдордиреЗ рдбреЗрдЯрд╛ рдЧреБрдгреЛрдВ рдкрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЛрдИ рднреА "рдореВрд▓реНрдп" рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рди рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдкрд░ . рдЬрдмрдХрд┐ рдКрдкрд░ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЖрдо рддреМрд░ рдкрд░ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

function decorator(proto, name) {
  return { value: new Point(0, 0); }
}

class Foo {
  <strong i="7">@decorator</strong>
  p: Point;

  setX(x) { this.p.x = 1; }
}

let a = new Foo();
let b = new Foo();
console.log(a.p.x); // 0
b.setX(10);
console.log(a.p.x); // 10 (!)

рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд░ "рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░" рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдИрдПрд╕ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рджреМрд░рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧреА рдХрд┐ рдорд╛рди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рд╕реЗрдЯ рд╣реИ рдпрд╛ рдкреНрд░рддрд┐-рдЖрд╡рдВрдЯрд┐рдд рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрднреА рдХреЗ рд▓рд┐рдП рдЖрдк рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реАрдзреЗ Object.defineProperty рдХреЙрд▓ рдХрд░рдХреЗ рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдореЗрдВ рдвреАрд▓ рджреА рдЬрд╛рдП рдпрд╛ рдирд╣реАрдВред

@rbuckton рдзрдиреНрдпрд╡рд╛рдж! рдХреНрдпрд╛ рдЖрдк рд▓реЛрдЧ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдЕрднрд┐рд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдмреЗрд▓ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╣реИред

рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреНрдпреЛрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рдХреНрдпрд╛ рд╣реИ?

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ example. рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧреЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ this рд╕рдВрджрд░реНрдн рд╕реЗ рдЬреБрдбрд╝реА рд╡рд╕реНрддреБ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЙрдХреНрдд рд╡рд╕реНрддреБ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкрд╛рд╕ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛ рдЬрд┐рд╕ рдкрд░ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЖрдк рдЗрд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ bar рдХреЛ рдХрдХреНрд╖рд╛ Foo рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП foo (рдпрд╛рдиреА foo.bar ) __get__ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд┐рдзрд┐ рдЬреЛ BoundMethod рд▓реМрдЯрд╛рддреА рд╣реИред рдЬрдм рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ self рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ foo ред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд▓рдЧрднрдЧ thisArg рдкрд╛рд╕ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдФрд░ function.bind рдХреЛ рдкреВрд░реЗ рд╕реНрдерд╛рди рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдХреЗрдд рд╣реВрдВред рдпрд╣рд╛рдБ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИ:
https://github.com/phosphorjs/phosphor-signaling/blob/1.0.1/src/index.ts#L144

рдЬрдм рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ ISignal рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрддрд╛ рд╣реИ рдЬреЛ рдорд╛рд▓рд┐рдХ рдХреЗ this рд╕рдВрджрд░реНрдн рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╡рд╛рдкрд╕ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
https://github.com/phosphorjs/phosphor-signaling/blob/1.0.1/src/index.ts#L263

рддреЛ рдЕрд╕рд▓ рдореЗрдВ, рдореИрдВ рдЗрд╕ рд╡рд░реНрдмреЛрдЬрд╝ рд╕рдордХрдХреНрд╖ рдХреЗ рд╢реЙрд░реНрдЯрдХрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдЬрд╛рд╡рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

class Foo {
  valueChanged: ISignal<number>;
}

defineSignal(Foo.prototype, 'valueChanged');

@rbuckton

ES3 рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ

рдХреНрдпреЛрдВ? рдореИрдВ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдЬреЛ ES3 рдореЗрдВ __decorate рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХ рд╕рдХреЗред

рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рд╡рд░рдгрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ ES3 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ
рд▓реЗ 4 рд╕рд┐рддрдВрдмрд░ реирежрезрел реи:режрей рдЕрдкрд░рд╛рд╣реНрди, "рдХреЛрд▓реЛрдЯреЛ" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдПрдХ рд▓реЗрдЦ :

@rbuckton https://github.com/rbuckton

ES3 рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ

рдХреНрдпреЛрдВ? рдореИрдВ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдЬреЛ ES3 рдореЗрдВ __decorate рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХ рд╕рдХреЗред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Microsoft/TypeScript/issues/2249#issuecomment -137717517
.

@sccolbert рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп ES6 рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

@ рдбреЗрд╡рд┐рдб рд╕рд╛рдЙрдерд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрднреА рддрдХ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ :(

@cybrown рд╣рд╛рдВ, рдпрд╣ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░

рдФрд░ ES3 рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд▓реА рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рд╡рд░рдгрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред { writable: true, enumerable: true, configurable: true } рдЬреИрд╕рд╛ рдХреБрдЫред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ ES3 рдХрд╛ рд╕рдорд░реНрдерди рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

@sccolbert рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдпрд╣ рд╕рдордЭ рдЖрддрд╛ рд╣реИред рд╕рдВрдпреЛрдЧ рд╕реЗ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ _this_ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдпрд╣рд╛рдВ рдХреЛрдИ рдорджрдж рдорд┐рд▓реЗрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд░рдирдЯрд╛рдЗрдо рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рд╣реИред

@JsonFreeman рдмреЗрд╣рддрд░ _this_ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрд░реЗ рдХреБрдЫ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ _this_ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд░ рд╕рдмрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдЪрд░реНрдЪрд╛ #3694 рдкрд░ рд╣реИред

рдЪреАрдпрд░реНрд╕!

рддреНрд░реБрдЯрд┐ TS1207: рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рд╛рдкреНрдд/рд╕реЗрдЯ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

<strong i="6">@get</strong>
public get myValue():any{...}

<strong i="7">@set</strong>
public set myValue(value:any){...}

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпрд╣ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ

<strong i="11">@get</strong>
<strong i="12">@set</strong>
public get myValue():any{...}

public set myValue(value:any){...}

рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЛ рдПрдХ рдХреЙрд▓ рдореЗрдВ Obect.defineProperty рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЬреЗрдПрд╕ рдХреНрд╡рд┐рд░реНрдХ рд╣реИ, рд╕реЗрдЯ рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рд╕рдВрдкрддреНрддрд┐ рдШреЛрд╖рдгрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд▓рдЧ рд╕реЗ рд╕реЛрдЪрдиреЗ рдкрд░ рд╕рдЪреЗрдд рдХрд░рдирд╛ рд╣реИ; рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред

рдмрд╕ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдПрдХ рд╣реА рдирд╛рдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдФрд░ рд╕реЗрдЯ рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЧрдардмрдВрдзрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░реЙрдкрд░реНрдЯреА, рд╕рдЬрд╛рд╡рдЯреА рдХреЛ рднреА рдХреНрдпреЛрдВ рди рдорд┐рд▓рд╛рдПрдВ?
рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рд╡рд┐рдХрд▓реНрдк рдзреНрд╡рдЬ рд╕рдВрдХрд▓рдХ рдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рдЫреЛрдбрд╝ рджреЗрдВред

рдзрдиреНрдпрд╡рд╛рдж

@TakoLittle : рдЖрдЬ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЙрдкрдЬрд╛ рд╣реИ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдбреЗрдХреЛрд░реЗрдЯрд░ рдЧрдгрд┐рддреАрдп рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ (_f_ _g_)(_x_) рдХреЛ _f_(_g_(_x_)) рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрд╕реА рдЕрд░реНрде рдореЗрдВ, рдпрд╣ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐:

<strong i="7">@F</strong>
<strong i="8">@G</strong>
class X {}

рд▓рдЧрднрдЧ рд╣реИ:

F(G(X))

рдЬрдм рдЖрдк рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рджреЛрдиреЛрдВ рдХреЛ рд╕рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЯреВрдЯ рдЬрд╛рддреА рд╣реИ:

class C {
  <strong i="15">@F</strong>
  set X(value) {}

  <strong i="16">@G</strong>
  get X() {}
}

F рдФрд░ G рдпрд╣рд╛рдВ рдХреИрд╕реЗ рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЖрджреЗрд╢ (рдпрд╛рдиреА F(G(X)) ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ? рдХреНрдпрд╛ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдлрд┐рд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╛рдиреА G(F(X)) )? рдХреНрдпрд╛ get рдФрд░ set рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрджреЗрд╢ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ (рдпрд╛рдиреА get рд╣рдореЗрд╢рд╛ set рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд)? рдЬрдм рддрдХ рд╣рдо 100% рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ рдХрд┐ рд╕рдмрд╕реЗ рд╕реБрд╕рдВрдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рдЪрд░рдг 2 рдпрд╛ рдИрд╕реАрдПрдордП -262 рдХреЗ рднреАрддрд░ рдмреЗрд╣рддрд░ рд╕реНрд╡реАрдХреГрддрд┐ рдХреЗ рд╕рд╛рде рд╣реИ, рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рдФрд░ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд╣реЛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рдмрд╛рдж рдХреА рддрд╛рд░реАрдЦ рдореЗрдВ рдЙрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@rbuckton рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж
рдЯреАрдПрд╕ рдЯреАрдо рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо !! ^^рдбреА

рдЗрд╕ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд╣рд╛рдВ рд╣реИ? рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рджреЗрдЦрднрд╛рд▓?

рдзрдиреНрдпрд╡рд╛рджред

@mhegazy рдХрд▓реНрдкрдирд╛ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рд╣реИрдВред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдпрд╣ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХрд▓реНрдкрдирд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирдП рдореБрджреНрджреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рднреА рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНтАНрддрд╛рд╡ рдЕрднреА рдЗрд╕ рд╕реНтАНрдерд╛рди рдкрд░ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдкрд░ рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдВред рд╣рдо рдирдП рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ @wycats рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@omeid , рдЖрдк https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

@mhegazy рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд╕реВрдЪрд┐рдд рд░рд╣рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред рдЬрдм рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдореБрджреНрджрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдореБрдЭреЗ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдСрд░реЗрд▓рд┐рдпрд╛ рд╕рдореБрджрд╛рдп рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЕрдкрдбреЗрдЯ рдкрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдмреИрдмреЗрд▓ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдлрд┐рд░ рд╕реЗ, TS рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдорд╣рд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлрдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрд╢рди рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдХреНрдпрд╛ рдХреЛрдб рдореЗрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рднреА рдпреЛрдЬрдирд╛ рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

blendsdk picture blendsdk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

CyrusNajmabadi picture CyrusNajmabadi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

uber5001 picture uber5001  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bgrieder picture bgrieder  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dlaberge picture dlaberge  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ