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;
};
рдПрдХ рд╡реИрдз рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
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 () { });
рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИрдореБрдЭреЗ рдЬреЛ рдпреБрдХреНрддрд┐ рд╕рдордЭ рдореЗрдВ рдЖрддреА рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ:
<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 https://github.com/Microsoft/TypeScript/pull/2589 рдкрд░
@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 рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдорд╣рд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлрдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрд╢рди рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдХреНрдпрд╛ рдХреЛрдб рдореЗрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рднреА рдпреЛрдЬрдирд╛ рд╣реИ?
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлрдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрд╢рди рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдХреНрдпрд╛ рдХреЛрдб рдореЗрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рднреА рдпреЛрдЬрдирд╛ рд╣реИ?