ES7 ์ ์
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ํ ES7 ์ ์์ https://github.com/wycats/javascript-decorators ์์ ์ฐพ์ ์ ์์ต๋๋ค.
ES7 ์ ์์ ์ด ์ ์์ ๊ธฐ๋ฐ์ด ๋ฉ๋๋ค. ๋ค์์ ์ ํ ์์คํ ์ ๋ํ ์ฐธ๊ณ ์ฌํญ์ ๋๋ค.๋ฐ์ฝ๋ ์ดํฐ ๋์:
@F("color")
<strong i="12">@G</strong>
class Foo {
}
์คํ ์ ๊ฑฐ:
var Foo = (function () {
function Foo() {
}
Foo = __decorate([F("color"), G], Foo);
return Foo;
})();
class Foo {
@F(color)
<strong i="19">@G</strong>
bar() { }
}
์คํ ์ ๊ฑฐ:
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() {}
}
์คํ ์ ๊ฑฐ:
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;
}
์คํ ์ ๊ฑฐ:
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) {}
}
์คํ ์ ๊ฑฐ:
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
์ฃผ์์ ๋ฌ์์ผ ํ๋ค๊ณ ํ์ง๋ง ์ค์ ๋ก ์ด๋ฌํ ์ผ์ด ์ผ์ด๋๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์์ ๋ ๋จ ํ๋๋ ์์ต๋๋ค.
๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ๋ B์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ์ํ ๊ฒ์ ๋๊น?
CoverMemberExpressionSquareBracketsAndComputedPropertyName์ ํด์์ ๊ตฌ์ฒดํํ๋ ๊ท์น์ ๋ฌด์์ ๋๊น?
๋๋ ๋ง์ ํ์ดํ์ด ๋ค์ํ ์ง์ ์์ Function | Object
๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ์ง๋ง, ์ด๊ฒ๋ค์ ํ์
์ฒดํฌ ์๊ฐ์ Object๋ก ๋ณ์ง๋ ๊ฒ์
๋๋ค. ๊ฑฐ๊ธฐ์ Function์ด ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๋๋ DecoratorFunction ๋ โโDecoratorFactory๋ผ๋ ์ฉ์ด์ ๋ํด ๋ฏธ์ณค์ง ์์ต๋๋ค. ์ ๋ Generator์ GeneratorFunction์ด ์๋ ์ ๋๋ ์ดํฐ์ ๋ช ๋ช ๋ฒ์ ๋ฐ๋ฅด๊ณ ์ถ์ต๋๋ค. ์ด ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ์ฌ DecoratorFunction์ ์ด๋ฆ์ Decorator๋ก, DecoratorFactory๋ฅผ DecoratorFunction์ผ๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํฉ๋๋ค.
์ฅ์ ์์ถ์ ๊ฒฝ์ฐ [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
PR #2399์ ์ถ๊ฐ๋ ๊ตฌํ
์ ๋ฐ์ดํธ: ์ ์์ด ์ ๋ฐ์ดํธ๋๊ณ @wycats ES7 JavaScript ๋ฐ์ฝ๋ ์ดํฐ์ ๋ํ ๋งํฌ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
ํ๊ธ๋ง์ ์ผ์ด ๋์ด ์ํ๊น์ต๋๋ค...
๋ํ ์ฐ๋น์ธํธ ๋ฐ์ฝ๋ ์ดํฐ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์ต๋๊น?
๊ธฐ๋ฅ์ ๋ํ ๊ทํ์ ์ ์๊ณผ ํจ๊ป @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 ๊ฐ์ฌํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ธฐ๋ฅ ๋ถ๋ถ์ด ์๋ @jonahandturner ์ ์์ ์์ ํ ํฌ๊ธฐํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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๊ฐ ๋จผ์ ์ฅ์๋๋ฉด dec2์ ์ ์ฉ๋ ๋๊น์ง dec1 ์์ฒด๊ฐ ์ฅ์๋์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ค์ ์ค์์ ์ ํํด์ผ ํฉ๋๋ค.
๋๋ ์ด ์ค ์ด๋ ๊ฒ๋ ์ข์ํ์ง ์์ง๋ง, ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ด๊ฒ์ JS ์ ์์ ๋๋ค. ๋ฐ๋ผ์ ์์ง์ ํํ์์ด ํจ์ ์ ์ธ์ ์ฐธ์กฐํ๋์ง ์ฌ๋ถ๋ฅผ ์์ง ๋ชปํ์ง๋ง ์ ์ ๋ถ์์ ํตํด ์ ์ ์์ต๋๋ค. ์ด๊ฑธ ๊ณ ๋ คํ์ธ์:
<strong i="6">@dec1</strong>
function dec2(target: Function) {
// Do stuff
}
dec2 = undefined;
<strong i="7">@dec2</strong>
function dec1(target: Function) {
// Do stuff
}
์ผ์ ! Javascript๋ ๋ ์ด์ ๋จ์ํ์ง ์์ต๋๋ค. :-)
_expressions_ ๊ธฐ๋ฅ์์๋ง ํ์ฑํํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์ ๋๋ค.
const foo = <strong i="6">@decorator</strong> () => {
// ...
}
const bar = <strong i="7">@decorator</strong> function() {
// ...
}
ํจ์ ํํ์ ๋๋ ๋๋ค๊ฐ ํธ์ด์คํธ๋์ง ์์ต๋๋ค.
typescript 1.5.0-alpha์ ๋ฐ์ฝ๋ ์ดํฐ์ ์ด์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?
@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 {
}
์ธ์ฌ๋ง.
์์ฑ์์ ์ ์ธ๋ ์ ํ์ ์ ํํ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์ ๋ด๋ ค๊ณ ๋ ธ๋ ฅ ์ค์ ๋๋ค.
์ฌ๊ธฐ์ ๋ด๊ฐ ํ๋ ค๊ณ ํ๋ ๊ฒ์ ์ค๋ช ํ๋ ๋ช ๊ฐ์ง ์ฝ๋๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ ๊ณ ์ ๋์ด ์์ต๋๋ค. ํด๋์ค D์ ์์ฑ์ ์ ์ธ์ ์๋ตํ๋ ๋ฐ ํ์ํฉ๋๋ค.
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์ ํ์ดํ์ด๋ ๊ตฌํ์ด ์ ํํ์ง ์์ต๋๋ค. ํ์ดํ์์ ๋์์ ํจ์์ด์ง๋ง typescript๋ฅผ ์ฌ์ฉํ๋ ๋์์๋ ํ๋กํ ํ์
๊ฐ์ฒด์
๋๋ค.
์ฌ๋ฐ๋ฅธ ์ ํ์ ์ป์ผ๋ ค๋ฉด ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ์บ์คํ
ํด์ผ ํฉ๋๋ค.
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)
}
}
});
});
}
๋๋ ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฐ API๋ฅผ ์ฌ์ฉํ์ฌ ์ต์คํ๋ ์ค(๊ทธ๋ฌ๋ ๋ชจ๋ ์น ํ๋ ์์ํฌ๊ฐ ์ง์๋ ์ ์๊ณ ์ด๋ํฐ ์ธํฐํ์ด์ค๊ฐ ์ ์๋จ) ์ฃผ์์ ๋ํผ๋ฅผ ๋ง๋ค์์ต๋๋ค. https://github.com/cybrown/web-decorators
ClassDecorator, ParameterDecorator ๋ฐ MethodDecorator๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@cybrown ์ง๊ธ ๋ง์คํฐ์ ์๋ #2635์์ ParameterDecorator
์ ๋ํ ์๋ช
์ ์
๋ฐ์ดํธํ์ต๋๋ค.
@rbuckton ๊ฐ์ฌํฉ๋๋ค.
ParameterDecorator์์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ๊ฐ์ง ์ ์์ต๋๊น?
์ด๊ฒ์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ด ParameterDecorator์ ์ฒซ ๋ฒ์งธ ์ธ์์ ์ ๋ฐ์ด ๋ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ ์ฉํ ์ ์์ต๋๋ค.
๊ฒ๋ค๊ฐ, ๊ทธ๊ฒ์ ์ถ์์์ ์ํ ๋งค๊ฐ๋ณ์ ์ด๋ฆ ๋งน๊ธ๋ง์ ๋ํ ํด๊ฒฐ์ฑ
์ด ๋ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ฑ์ทจํ๋๋ก ์์ฒญ๋ฐ์๋ค:
@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[]){ ... }
@jonahandturner๊ฐ ์ฌ๊ธฐ์์ ์ค๋ช ํ๋ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ
@cmchaelgraham ์, ๋ฐํ์ ์ ํ ์ ๋ณด(AtScript์ ์ค๋ช ๋ rtti)๊ฐ ์์ผ๋ฉด ๋ด๋ถ ๊ฒ์ฌ์ ๊ฐ์ด ์์ ํ ๋ถ๋ฆฌ๋ ๊ธฐ๋ฅ์์๋ ๊ทธ๋ฐ ์ข ๋ฅ์ ์ฌ์ฉ์ ๋งค์ฐ ์ข์ต๋๋ค.
@cmchaelgraham ์ https://github.com/Microsoft/TypeScript/pull/2589๋ฅผ ์ดํด๋ณด์ญ์์ค.
@cmicaelgraham ์ฐ๋ฆฌ๋ ๋ฐ์ฝ๋ ์ดํฐ์ ํจ๊ป ์๋ํ ๋ฉํ๋ฐ์ดํฐ API ๋ฅผ ์ถ๊ฐํ๋ ES7์ ๋ํ ์ ์์ ์์ ์ค์ ๋๋ค. #2589๋ ํด๋น ์ ์์ ๋ํ ์คํ์ ์ง์์ ์ถ๊ฐํ์ง๋ง ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ ค๋ฉด ๋ณ๋์ ํด๋ฆฌํ ์ด ์์ด์ผ ํฉ๋๋ค.
@rbuckton @cmichaelgraham ์๋ ๋ฐ์ฝ๋ ์ดํฐ ๋์์ ๋ฐ๋ผ ๋ฐ์ฝ๋ ์ดํฐ์ ์ ํ์ ์ฃผ์
ํ๋๋ก ์ปดํ์ผ๋ฌ์ ์ง์ํ๋ ํน์ํ TypeScript ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ํ ๋์์ธ์ด ์์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด @parameterTypes
๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ ์ผ๋ฐ์ ์ธ ๋ฉํ ๋ฐ์ดํฐ API๋ฅผ ์ํด ๊ทธ ๊ธฐ๋ฅ์ด ์ ๊ฑฐ๋๊ณ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ๋ง์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ง์ํ๊ฒ ์ต๋๋ค.
TypeScript์ ๊ด๋ จ๋ ์ํ์ ๋ํด ์กฐ๊ธ ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น? 1.5 ์ถ์ ์์ ์ธ๊ฐ์? ๊ทธ๋ ๋ค๋ฉด ์ปดํ์ผ๋ฌ ์ต์ ์ ์ด๋ป๊ฒ ์๊ฒผ์ต๋๊น? ์ ์ฉํ ํ ๊ฐ์ง๋ ์ปดํ์ผ๋ฌ๊ฐ ์์ฑ์ ์๋ช ์ ๋ํด์๋ง ํ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์ฑํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
@EisenbergEffect ๋ฐ์ฝ๋ ์ดํฐ๋ 1.5์ ์ผ๋ถ์ด๋ฉฐ ์ต์ ๋ฆด๋ฆฌ์ค 1.5-alpha์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฉํ ๋ฐ์ดํฐ ์ง์์ ๊ดํด์. @paramtypes
๋ํ ์๋ ์ ์ ์ดํ ๋์์ธ์ด ๋ณ๊ฒฝ๋์์ต๋๋ค. ์๋ก์ด ๋์์ธ์ Reflect.metada ์ ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์๋ ๋ฐฉ์์ ๋ํ ์์ธํ ๋ด์ฉ์ #2589๋ฅผ ์ฐธ์กฐํ์ธ์. ๋ํ @rbuckton ์๋ https://github.com/rbuckton/reflectDecorators ์์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ pollyfill์ด ์์ต๋๋ค.
@mhegazy ์๊ฒ ์ต๋๋ค . ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค: http://blog.durandal.io/2015/04/09/aurelia-update-with-decorators-ie9-and-more/ :smile:
๋ฉํ๋ฐ์ดํฐ ์ ์์ ๋ํด์๋ ์ ์๊ณ ์์ต๋๋ค. ์ด์ ๋ํ ํผ๋๋ฐฑ์ ํด์์ต๋๋ค. ์๋ @parameterTypes
์์ด๋์ด๊ฐ ์ ๊ฑฐ๋๋์ง ์๊ณ ์ถ์์ต๋๋ค.
๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค @EisenbergEffect . :+1:
์. @paramtypes
์ ์ ์ผํ ๋ฌธ์ ๋ ๋ฐฉ์ถ์ด ์ ํ ์์คํ
์ ์ํด ์ง์๋๊ณ ์ ์ญ ํ๋ก๊ทธ๋จ ์ ๋ณด๊ฐ ํ์ํ๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋จ์ผ ๋ชจ๋ ๋ณํ์ ๋ํ ์๋๋ฆฌ์ค๋ฅผ ์ค๋จํฉ๋๋ค(#2499 ์ฐธ์กฐ). ๋ค๋ฅธ ์ต์
์ ์ฝ ์ฌ์ดํธ์ ๋ฃ๋ ๊ฒ์ธ๋ฐ, ์ด๋ ์์ฑ์ ๋์ ๋ฐ์ฝ๋ ์ดํฐ ์ฌ์ฉ์์๊ฒ ๋ง์ ์์
์ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ค์ ๊ธฐ๋ณธ์ผ๋ก ๋์๊ฐ์ Reflect.metadata ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค.
์ ์์ ์ด์ ๋ฒ์ ๋ ๋ดค๋ค๋ฉด ๊ฐ์ ์ด์ ๋ก ์ฐ๋น์ธํธ/๋์์ธ ํ์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ๊ฑฐํด์ผ ํ์ต๋๋ค.
๋ช ํํ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ดํด๊ฐ ๋ฉ๋๋ค. Reflect ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ด 1.5์ ๋์ ๋ ์ง ์ฌ๋ถ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
์. ํ์ฌ ๋ง์คํฐ์ ์์ต๋๋ค. ๋ค์ ๋ฆด๋ฆฌ์ค์์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ํ์ฌ ์คํ ํ๋๊ทธ --emitDecoratorMetadata
์ฌ์ฉํ๋ ์ตํธ์ธ ๊ธฐ๋ฅ์
๋๋ค. ๋ฐ์ฝ๋ ์ดํ
๋ ์ํฐํฐ์๋ง ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
"๋ฐ์ฝ๋ ์ดํ
๋ ์ํฐํฐ์๋ง ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค." ๊ทธ ์์ด๋์ด๋ฅผ ํ์ฅํ ์ ์์ต๋๊น? ํน๋ณํ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์ฐธ์ฌํฉ๋๊น? ์๋๋ฉด ์ด๋ค ๋ฐ์ฝ๋ ์ดํฐ์ ํจ๊ป ๋ฌด์์ด๋ ์ถ๊ฐํฉ๋๊น? ์ฆ, ๊ฐ๋ฐ์๊ฐ Aurelia์ inject
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋๋ก ํธ๋ฆฌ๊ฑฐํฉ๋๊น?
๊ฐ๋ฐ์๊ฐ Aurelia์ ์ธ์ ํธ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋๋ก ํธ๋ฆฌ๊ฑฐํฉ๋๊น?
์.
๋ด๊ฐ ์๋ฏธํ๋ ๋ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<strong i="9">@inject</strong>
class Foo {
constructor(a: number, b: string) {}
}
class Bar {
constructor(a: number, b: string) {}
}
ํจ๊ป --emitDecoratorMetadata
(์ฆ, ํธ์ถ์ ์
๋ ฅ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ๋ฐฉ์ถ ํ ์ปดํ์ผ๋ฌ reflect.metadata('desing:paramtypes', [Number, String])
์ฉ) Foo
์ด์ง๋ง _not_ Bar
.
๊ทธ๊ฒ์ ์ฐ๋ฆฌ๋ฅผ ์ํด ์๋ํฉ๋๋ค. ๋ค์ ๋ฆด๋ฆฌ์ค, ์๋ง๋ ๋ค์ ์ฃผ์ Reflect.metadata API์ ๋ํ ์ง์์ ์ค๋นํ ๊ฒ์ ๋๋ค. ์ค๋ช ๊ฐ์ฌํฉ๋๋ค!
๊ทธ๋์ ์ด๊ฒ์ ์ํด ๋ฌด์์ ๋ฐฉ์ถํฉ๋๊น?
``` ์ธ์ด=์๋ฐ์คํฌ๋ฆฝํธ
@์ฃผ์ฌ
ํด๋์ค ํธ {
์์ฑ์(a: A, b: B) {}
}
ํด๋์ค ๋ฐ {
์์ฑ์(a: ์ซ์, b: B) {}
}
would it be (for Foo):
``` javascript
reflect.metadata('desing:paramtypes', [A, B])
@cmchaelgraham ์, ๋๋ต์ ์ผ๋ก ์์ฑ๋ ๊ฒ์ ๋๋ค.
๋ฏธ์น ๋ฉ์ ธ!!!!
gulp -typescript ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ ๊ตฌ์ถ - (๋ฉ์ง @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);
๋ฐ๋ผ์ ์ด๋ก ์์ผ๋ก๋ ์ฃผ์ ๋ฐ์ฝ๋ ์ดํฐ ํจ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฃผ์ ์์ ์ง์ ํ์ง ์๊ณ ์ ์ ํ ํด๋์ค๋ฅผ ์ฃผ์ ํ ์ ์์ง๋ง ๋์ ์์ฑ์์์ ์ ํ์ ์ง์ ํ ์ ์์ต๋๋ค. :)
@cmhichaelgraham ์ฐ๋ฆฌ๋ ํ๋ ์์ํฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ด๊ฒ์ ์ฝ๊ฒ ํ์ฑํํ ์ ์์ต๋๋ค. Aurelia์ DI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ container.addParameterInfoLocator
ํํฌ๊ฐ ์์ต๋๋ค. ํ์์ ์ทจํ๊ณ ์ข
์์ฑ์ ๋ฐํํ ์ ์๋ ํจ์๋ฅผ ์ ๋ฌํฉ๋๋ค. ๋ค์ ๋ฆด๋ฆฌ์ค(๋ค์ ์ฃผ)์์๋ ์ด๊ฒ์ ํต์ฌ ๊ตฌ์ฑ์ ์ถ๊ฐํ ์ ์์ผ๋ฏ๋ก TypeScript ๊ฐ๋ฐ์๊ฐ ์ฝ๊ฒ ์ผค ์ ์์ต๋๋ค. ์ด๋ฒ ์ฃผ ์ถ์์ ๋ฃ์์ด์ผ ํ๋๋ฐ ์ด๊ฒ ๋ณ๊ฒฝ๋ ์ค์ ์์ง ๋ชฐ๋์ต๋๋ค.
@EisenbergEffect ๋ธ๋ฆด๋ฆฌ์ธํธ !! :+1:
๋๋ ์ฃผ์์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ์์ฑ์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ํ์ํ๋๋ฐ, ์ด๋ ๊ธฐ๋ณธ ๊ฐ์ฒด๋ฅผ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ก ๋ณํํฉ๋๋ค(๊ด์ฌ ์๋ ์ฌ๋๋ค์ ์ํด https://github.com/mweststrate/MOBservable/commit/8cc7fc0e20c000db660037c8b5c9d944fe4155d9).
๊ทธ๋ฌ๋ ํนํ ์์ฑ์ ๊ฒฝ์ฐ ํด๋์ค ์์ฒด์ ์์ฑ์๊ฐ ์๋ ํ๋กํ ํ์
์ ์ฃผ์์ ์ ์ฉํ๋ ๊ฒ์ด ๋ค์ ๋ถ์์ฐ์ค๋ฝ๊ฒ ๋๊ปด์ก์ต๋๋ค. ์ฆ, ์ด๊ธฐ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์ด๋ ต๊ฑฐ๋ this
๋ ์ด๋ ต์ต๋๋ค. this
๋ฐ ๊ฐ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์์ด ์ํํด์ผ ํ๋ ์ค์ ๋
ผ๋ฆฌ๋ฅผ ์ํํ๋ ๊ฒ์
๋๋ค.
๊ฒ๋ค๊ฐ ๊ต์ฅํ ๊ธฐ๋ฅ!
Metadata Reflection API๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์์ฑ ์ข
์์ฑ ์ฃผ์
์ ์ํํ ์ ์์์ต๋๋ค.
ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ https://github.com/matjaz/property-DI/commit/2b4835e100b72d954b57d0e656ea524539ac17eb์์ ํ์ธํ ์ ์์ต๋๋ค
๋ชจ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ณด๋ค ๋จผ์ ํธ์ถ๋๋ ์์ฑ๋ ์ฝ๋์์ __metadata ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์๋์ด์ผ ํฉ๋๊น? ํด๋์ค์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ deocrator๋ฅผ ๋ง๋ค๊ณ ์ถ์์ง๋ง __metadata('design:paramtypes', [TYPES....])๊ฐ ๋ง์ง๋ง์ผ๋ก ํธ์ถ๋์์ผ๋ฏ๋ก Reflect์์ ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
@ufon ๋ณด๊ณ ์๋ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น?
๋ฌผ๋ก ์ ๋๋ค. https://gist.github.com/ufo/5a2fa2481ac412117532
ํธ์งํ๋ค:
๋ด ๋์, ๋ด ์ฝ๋์ ๋ค๋ฅธ ์ค์๊ฐ ์์ต๋๋ค. ํด๋์ค ์ด๊ธฐํ ํ์๋ ์ ํ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
@ufon , ๋๋ ๊ทธ๋ ๋ด๊ฐ ๋ฌธ์ ๋ฅผ ๋ณผ ์ ์๋์ง ํ์ ํ์ง ๋ชปํฉ๋๋ค. __metadata๋ ๋ฐ์ฝ๋ ์ดํฐ ๋ชฉ๋ก์ ๋ง์ง๋ง ํญ๋ชฉ์ ๋๋ค. ์ฆ, ์ด๊ฒ์ด ๊ฐ์ฅ ๋จผ์ ์คํ๋๊ณ , ํ์คํ ์ฃผ์ ์ด ์คํ๋๊ธฐ ์ ์ ์คํ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
House = __decorate([
inject_1.inject,
__metadata('design:paramtypes', [Floor, String])
], House);
์ฌ๊ธฐ์ __decorate
์ ์๋ ๊ถํ ์ถ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ญ์์ผ๋ก ์คํํฉ๋๋ค.
decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);
์ด๋ ๋ฐ์ฝ๋ ์ดํฐ(ํํ์)๊ฐ ์ ์ธ ์์๋๋ก ํ๊ฐ๋์ง๋ง ์ญ์์ผ๋ก ์คํ๋์ด ์ธ๋ถ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๋ด๋ถ ๋ฐ์ฝ๋ ์ดํฐ์ ๊ฒฐ๊ณผ๋ฅผ ์๋นํ ์ ์๋๋ก ํ๋ ์ฌ์๊ณผ ์ผ์น์ํค๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
์๊ฒ ์ต๋๋ค, ์ฃ์กํฉ๋๋ค: ์ฃ์กํฉ๋๋ค. ์ ์ฝ๋์ ๋ค๋ฅธ ์ค์๊ฐ ์์ต๋๋ค. ํด๋์ค ์ด๊ธฐํ ํ์๋ ์ ํ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋น์ ์ ๊ทธ๋ค์ ์ด๋ป๊ฒ ์ฟผ๋ฆฌํ๊ณ ์์ต๋๊น? Reflect.metadata์ ๋ํ pollyfill์ด ์์ต๋๊น?
์์ ์ ์ถ๊ฐ ...
Reflect.getMetadataKeys(ํ์ฐ์ค);
์ด ๊ฒฐ๊ณผ ๋น ๋ฐฐ์ด ..
์, 'reflect-metadata' ํจํค์ง๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๊ฒ์ ์์ด๋ฒ๋ฆฐ polyfill ๊ฐ์ ์ธ๋ชจ, @rbuckton ๋น์ ์ ์ข ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
๋ฐ์๋ค๊ณ ์๊ฐํด...
ํ์๋ typescript์ ๋์ฐ๋ฏธ ์ฝ๋ ๋ค์ ์ด๋๋ฉ๋๋ค.
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๋ ๋งค๊ฐ๋ณ์(target, propertyName, propertyDescriptor)๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ๋๋ ๋ฐ๋ฉด ํ์์์๋ F๊ฐ ๋งค๊ฐ๋ณ์()๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ๋๋ฉฐ ๋ฐํ๋ ๋ด๋ถ ํจ์๊ฐ ์์ด์ผ ํฉ๋๋ค. ์์ฑ ์ค๋ช ์).
๋ด ๊ฐ์ ์ @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]);
}
์ง์ง ๊ณ ํต์ ๋๋ค.
@Tharaxis ์ด ๋์์ @F
๋ฐ @F()
๋ ๋์ผํ์ง ์์ต๋๋ค. @F
๋ ๋ฐ์ฝ๋ ์ดํฐ F
@F
ํธ์ถํฉ๋๋ค. ์ฌ๊ธฐ์ @F()
๋ ๋น ์ธ์ ๋ชฉ๋ก์ผ๋ก ๋ฐ์ฝ๋ ์ดํฐ ์์ F
๋ฅผ ํธ์ถํ ๋ค์ ๊ฒฐ๊ณผ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ F
์ ์๋ช
์ ํ ๋น ๊ฐ๋ฅํ declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
์ ๋น๊ตํ๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํ์
ํ๋ ค๋ฉด ๋ ๊ฐ๋ ฅํ ํ์ธ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด #3246์ ๊ธฐ๋กํ์ต๋๋ค. ๋๋ ๋น์ ์ด ์ฌ๋ฐ๋ฅธ ์ผ์ํ๊ณ ์๋ค๊ณ ๋ฏฟ์ผ๋ฉฐ ์ปดํ์ผ๋ฌ๋ ๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ์ ์๋ชป๋ ์ฌ์ฉ์ ํฌ์ฐฉํด์ผ ํฉ๋๋ค.
@mhegazy ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ ๊ทธ๋ฐ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง @F
๋ฐ @F()
๋๋ฑํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ฐฐ์ ํ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๊น ? ๊ถ๊ทน์ ์ผ๋ก ๋ ๋ค ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฅ์ ๋์ผํ ํธ์ถ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. , ๊ทธ๋ค ์ค ํ๋๋ง ์ธ๋ถ ํฉํ ๋ฆฌ ํจ์์ ๋ํ ํธ์ถ์ ํฌํจํฉ๋๊น? ์ด๊ฒ์ ํ์คํ ๋งค์ฐ ๋๋ผ์ด ๋์์ด๊ณ API ์๋น์์ ๊ด์ ์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํธ์ถํ๋ ๋ฐ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ด์ผ ํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ต์ ๋๋ผ์์ ์์น์ด ์๋ฐ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
JS ๊ด์ ์์ ์ฐจ์ด๊ฐ ์๋ค๋ ๊ฒ์ ์์ง๋ง(ํ๋๋ F ํจ์์ ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ๊ณ ๋ค๋ฅธ ํ๋๋ ํจ์๋ฅผ ์คํํ ๋ค์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ํด๋น ๊ฒฐ๊ณผ์ ์ฐธ์กฐ๋ฅผ ์ ๋ฌํฉ๋๋ค), ์ ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. @F
๋ก ์ ๋ฌ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋น ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ด ์๋ ํฉํ ๋ฆฌ์ ์์์ ์ผ๋ก ์ผ์น(๋ฐ ํธ์ถ)ํ ์ ์๋ ์ด์ ๋ฅผ ํ์คํ ์ดํดํ๊ณ ์์ต๋๊น?
์ปดํ์ผ๋ฌ๋ ๊ทธ๊ฒ์ด ํฉํ ๋ฆฌ์ธ์ง ๋ฐ์ฝ๋ ์ดํฐ์ธ์ง ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด ์๋ช ์ด ์๋ ๊ฒฝ์ฐ:
declare function decoratorOrFactory (...args: any[]): any;
์ด๊ฒ์ ๋ฐ์ฝ๋ ์ดํฐ์ ๋๊น ์๋๋ฉด ๊ณต์ฅ์ ๋๊น? ๋น ์ธ์๋ก ํธ์ถํด์ผํฉ๋๊น?
์ปดํ์ผ๋ฌ๊ฐ ํ ์ ์๋ ๋๋ถ๋ถ์ ์๋ช ์ ํธ์ถํ ๋ ์๋ช ์ด ์ผ์นํ๋์ง ํ์ธํ๊ณ ์ผ์นํ์ง ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
@rbuckton ์๋ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๊ณต์ฅ์ผ๋ก ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ์ ํ๋๊ทธ๋ฅผ ์ง์ ํด์ผ ํ๋ #3246์ ๋ํ ์์ ์ฌํญ์ด ์์ผ๋ฏ๋ก ๊ณ์ ์ง์ผ๋ด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
@mhegazy , ๋ด๊ฐ ๋งํ๋ ๊ฒ์ ๋ฐ์ฝ๋ ์ดํฐ(์ฆ, @F
๋๋ @F()
)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ _ํญ์_ ํฉํ ๋ฆฌ ํจ์ 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;
๊ทธ๋ค์ ๊ฐ์ ์ผ์ ํ์ง๋ง ๋๋ ๊ทธ๊ฒ๋ค์ ๋ค๋ฅด๊ฒ ์ ์ธํด์ผ ํฉ๋๋ค! ๊ทธ๋ฌ๋ ์๋ฐฉํฅ์ผ๋ก ์กด์ฌํ ์ ์๋๋ก F๋ฅผ ์ ์ธํ๋ ๊ฒ์ ์ ๋ง ๋ฒ๊ฑฐ๋กญ๊ณ ์ผ๊ด๋ ๋งค๊ฐ๋ณ์์ ๋ฌธ์๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ์ ํํ๊ณ API ์๋น์๊ฐ ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ฏธ๋ฆฌ ์ด ๊ตฌ๋ถ์ ์์์ผ ํฉ๋๋ค.
@Tharaxis ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฌ์ฉ๋ F
๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณด๊ณ ์๋ค๋ฉด @F
์ @F()
๊ฐ ์์ ํ ๋ค๋ฅผ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. C
์ C()
๊ฐ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์์ํ๋ ๊ฒ์ฒ๋ผ ์ฒซ ๋ฒ์งธ๋ ๊ฐ์ ์ฐธ์กฐํ๊ณ ๋ ๋ฒ์งธ๋ ๊ฐ์ ํธ์ถํฉ๋๋ค. @F
๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํ๊ณ @F()
๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ๋์ผํ ์์
์ด ์๋๋ฉฐ ๊ทธ๋ ๊ฒ ๋์ด์๋ ์ ๋ฉ๋๋ค.
@DavidSouther ์ด๊ฒ์ด ๊ทธ๋ด ์ ์๊ฑฐ๋ ๊ทธ๋ ์ง ์์ ํ๋นํ ์ด์ ๊ฐ ์์ต๋๊น? @F
ํธ์ถ๊ณผ @F()
ํธ์ถ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฐจ์ด๋ ์์ง๋ง ์ ์ ๋ฐ ๋ฌธ์ํ ๋ฐฉ๋ฒ ๊ฐ์๋ ์๋นํ ํฐ ์ฐจ์ด๊ฐ ์์ผ๋ฉฐ ํธ์ถ์ ๋ถํ์ํด์ผ ํ๋ ์ถ๊ฐ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋ฉ๋๋ค.
๋ด ์ ์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ํ๋ ๋ฐ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ด์๋ ์ ๋๋ฉฐ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ ๊ฐ์ง ์ด์ ์ ์ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๋๋ค.
@F ์ @F() ํธ์ถ ์ฌ์ด์๋ ๊ธฐ๋ฅ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋
ผ์์ ์ฃผ์ ํฌ์ธํธ๋ผ๊ณ ์๊ฐํ๋ค. ๋๋ ์ด๊ฒ์ด ์ฌ์ค์ด๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค. F๋ ํจ์์ ๋ํ ์ฐธ์กฐ์ด๊ณ , F()๋ ๋น ์ธ์ ์งํฉ(์: F.call(this, [])
)์ผ๋ก ํธ์ถ๋ ๋ F์ ๋ฐํ ๊ฐ์ ๋ํ ์ฐธ์กฐ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ๋ค์ ๊ธฐ๋ฅ์ ์ผ๋ก, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋
์ ์ผ๋ก ๋ค๋ฅธ ๋ ๊ฐ์ง์
๋๋ค.
@Tharaxis @F
์ @F()
๋ ๋ค๋ฆ
๋๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ฐจ์ด, ๋ฌธ์ํ ๋ฐฉ๋ฒ์ ์ฐจ์ด, ์ ๋์ ์ผ๋ก ํ์ํ ํธ์ถ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ง๋ฌธํด ๋ณด๊ฒ ์ต๋๋ค. ์ ๋ชจ๋ ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฅ์ด ํฉํ ๋ฆฌ์ฌ์ผ ํฉ๋๊น? ๊ทํ์ ์ ์์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ฐ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
@mhegazy ํ์์ ์ต์
( @F()
)์ ๊ฒฉ๋ฆฌ๋(๋ฐ ๋ณต์ ๋) ๋ฐ์ฝ๋ ์ดํฐ ํจ์์ @F
ํธ์ถ์ ํตํด ๊ธฐ๋ฅ์ ํด๋ก์ ์ ์ถ๊ฐ ์ค๋ฒํค๋๋ฅผ ์์ฑํ๋ค๋ ์ ์ ์ธ์ ํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ๊ณต์ ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฅ ์ฐธ์กฐ์ ๋ํด ์ํํ๋ฏ๋ก ํด๋ก์ ๋ฅผ ํตํ ๊ฒฉ๋ฆฌ๊ฐ "๋ ์์ "ํ๊ณ ์ผ๊ด์ฑ์ด ์์ด ๋๋ผ์์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค.
@DavidSouther ๊ทํ์ ์ง๋ฌธ์ ๊ทํ๊ฐ ๊ฐ๋จํ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ ์ํ๋ ๊ฒ์ ๋ฌ๋ ค ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํํ์ ๊ฐ๋จํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉํดํ๋ ๊ฒ์ ์์ต๋๋ค.
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;
}
์์งํ ๋์ฐํฉ๋๋ค. ๋ํ ์ด์ ์ผ๋ฐํํด์ผ ํ๋ฏ๋ก ๋ฐ์ฝ๋ ์ดํฐ F์ ๋ํ ๋ชจ๋ ์ค์ํ ๋งค๊ฐ๋ณ์ ์ธํ ๋ฆฌ์ผ์ค๋ฅผ ์๊ฒ ๋ฉ๋๋ค.
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ํ๊ณ ๋ฌธ์ํํ๊ธฐ ์ฝ๊ณ ์ผ๊ด์ฑ ์๊ฒ ํ๋ ๊ฒ์ ๋ํด์๋ ํ ๋ง์ด ๋ง์ต๋๋ค. ์ฐ๋ฆฌ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฌ๋์ด ๊ทธ ์ฝ๋์ ์์ฑ์์ธ ์ฐ๋ฆฌ์ ๊ฐ์ ์ง์์ด๋ ์ดํด๋ ฅ์ ๊ฐ์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋๋ก ์ค์ค๋ก๋ฅผ ์์ด์ง ๋ง์๋ค.
@Tharaxis ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ํ ๋์์ธ ์ด๊ธฐ์ ์ด๊ฒ์ ๋ํด ์๊ฐํ๊ณ ๊ตฌ์ฒด์ ์ธ ์์ ์ ์ดํดํฉ๋๋ค. @mhegazy ์ @DavidSouther ๊ฐ ์ด ์ค๋ ๋์์ ์ด์ ์ ์ธ๊ธํ๋ฏ์ด ์ด ๋์์ JavaScript ํจ์์ ํ์ค ๋์๊ณผ ์ผ์นํฉ๋๋ค.
๋ฐ์ฝ๋ ์ดํฐ์ ๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ ๋ชจ๋์ ์ญํ ์ ํ ์ ์๋ ํจ์๋ฅผ ์์ฑํ๋ ค๋ ์๋๋ ๋ค์ ๋ณต์กํ ์ ์๋ค๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ํญ์ ๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ด ๊ดํ์ด ์ฑํ๋๋๋ก ๋ฆฐํฐ์ ๊ท์น์ ์ ๊ณตํ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ์ ์์ต๋๋ค.
๋ํ ๋ฐ์ฝ๋ ์ดํฐ์ ๋ํ ์ ํ ๊ฒ์ฌ์ ๋ถ์ผ์น์ ๋ํ ์ด์ ์์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐฉ๊ธ PR #3249๋ฅผ ์ ์ถํ์ต๋๋ค.
์๋ ํ์ธ์ @rbuckton ๋ ,
์ ๋ @Tharaxis๊ฐ ์ธ๊ธํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฌ์ฉํ์ง ์๋ ์ฌ์ฉ์ ์ค ํ๋์ ๋๋ค...
๋ด๊ฐ ๊ฐ์ง ์ง๋ฌธ์ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๊ธฐ๋ฅ๊ณผ ์ผ์นํด์ผ ํ๋๊ฐ? ์ฆ, ํจ์์ ๊ฒฝ์ฐ this.f ๋ this.f()๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋ด๊ฐ ๊ฐ์ ์ํ ๋๋ ์๊ณ ๊ฐ์ ์์ฑํ๋ ๊ฒ์ ์ํ ๋๋ ์๊ธฐ ๋๋ฌธ์ ์์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋ฐ์ฝ๋ ์ดํฐ์ ๊ฒฝ์ฐ ์ธ์ด ๊ธฐ๋ฅ ์์ค์์ ๋์๊ฒ ๋ช ํํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋จ์ง ๋ฐ์ฝ๋ ์ดํฐ @F ๋ฅผ ์ ์ฉํ๊ณ ์ถ๋ค๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ํฉํ ๋ฆฌ ๋๋ ์ ์ ๋ฉ์๋๋ก ๊ตฌํ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ ๋ง๋ก ์๊ณ ์ถ์ง ์์ต๋๋ค. ๋ด๊ฐ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๊ฐ์ง ์ ์๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ์์ด๋ฒ๋ฆฌ์ง ์๋ ํ ๋ง์ ๋๋ค.
์์ ๋ด์ฉ์ด ์๋ชป๋์๊ฑฐ๋ ๋ฌด์งํ ๊ฒฝ์ฐ ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ์ ๋ ๋น๊ต์ ์๋ก์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ธ๊ณ์ ๋๋ค.
๊ฐ์ฌํฉ๋๋ค & ๊ฑด๋ฐฐ
๋ํ ๊ทธ ์ง๋ฌธ์ ํด์ผ ํฉ๋๋ค. "ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋์๊ธฐ ๋๋ฌธ์"๊ฐ ์๋ ๋ค๋ฅธ ์ค์ ์ด์ ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง _if_ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋ฌธ์ ๋๋ฑ์ฑ์ ์ ์งํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์ต๋๊น? ๋๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๊ธฐ๋ง ํ๋ฉด _๋ฐ์_ํ๋ ๊ธฐ๋ฅ๊ณผ ์์ ํ ๊ด๋ จ์ด ์๋ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ์ฌ @F
๋ฐ @F()
๊ฐ ๋์ผํ์ง ์๋ค๋ ์ฌ์ค์ ๋ค์ ๋ฌธ์ ๋ฅผ ์ ๋ฐํฉ๋๋ค.
@F
์ @F()
์ ์ฐจ์ด์ ๊ณผ ์ด๊ฒ์ด ์๋ํ๋ ์ด์ ์ ์๋ํ์ง ์๋ ์ด์ ( @F
๋ @F()
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ )๋ฅผ ์ดํดํด์ผ ํ๋ ๊ฐ๋ฐ์ declare function A(params?: any): ParameterDecorator
๋ declare function B(target, name)
, @A
๋ ์๋ํ์ง ์์ง๋ง @A()
๋ ์๋ํ๊ณ @B
๋ ์๋ํ์ง๋ง @B()
๋ ์๋ํ์ง ์์ง๋ง ์ธ์ง์ ์ผ๋ก๋ ์ธ์๊ฐ ์๋ ๋ฐ์ฝ๋ ์ดํฐ์ ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ๋์ผํฉ๋๋ค.@F
)๋ฅผ ์์ฑํ๊ณ ์ด์ ์ผ๋ถ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ(๊ทธ๋ฌ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด ์ ํ์ฌํญ์ผ๋ก ์ค์ ) ์ฝ๊ฐ ๋ ๋ง์ ์์
์
๋๋ค. ํ์ฌ ๋ฐฉ๋ฒ์์๋ ๋ชจ๋ @F
์ ์ฉ์ @F()
๋ก ๋ฆฌํฉํ ๋งํด์ผ ํฉ๋๋ค. ์ผ๋ถ๋ ์ฝ๋ ๋ด์์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ฝ๋๋ก ๋ณ๊ฒฝํ์ญ์์ค.@Tharaxis @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๊ณผ ๊ทํ ์์ ์ด ์ค๋ช ํ ๋ฐ์ฝ๋ ์ดํฐ ์์ ์ ์กฐํฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ต๋๋ค. ๋ง์ต๋๊น? ์๋ ๋ฐฉ์์ ๋ํด์๋ ์์ง ๊ฒฐ์ ๋ ๋ฐ๊ฐ ์์ผ๋ฉฐ ์ ์์๊ฐ ์น์ธ ์ ์ _๋ง์_ ๋ฐ๋ณต์ ๊ฑฐ์น๊ฒ ๋ ๊ฒ์ด๋ฏ๋ก TS์์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋๋ก ํ ๋ค์ (์ ์ด๋ ์๋) TS์์ ์ป์ ๊ฒฝํ์ ๊ธฐ๋ฐ์ผ๋ก ์์ด๋์ด ๋ค์ ์ ์์ ๊ด๋ จ๋ ๋ค์ํ ๋น์ฌ์? ES6 ์ฌ์์ด ์ฝ๊ฐ ๋ค๋ฅธ ๋์์ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ TS๊ฐ ๋์ค์ ๋ฆฌํฉํ ๋งํด์ผ ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ๊ฒ์ ์ด๋ฒ์ด ์ฒ์์ด ์๋๋๋ค. ์์ง ์กด์ฌํ์ง ์๊ณ ์์ง ํฉ์๋์ง ์์ ์ฌ์์ ๋ํด ์ถ์ ํ๋ ํ _ํญ์_ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํจ์์ ๊ดํ ๋น์ ์ ์์ ๊ดํด์๋, ์ฐ๋ฆฌ๊ฐ ํจ์๊ฐ ์ค์ ๋ก๋ ์์ ํ ๋ค๋ฅธ ๊ตฌ์กฐ์ผ ๋(๊ทธ๋ฆฌ๊ณ ๊ทธ๋์ผ๋ง ํ ๋) ๋ฐ์ฝ๋ ์ดํฐ์ ๋ณํฉํ๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. JavaScript์์ ํจ์๋ก ์์ ํ ๋ ํจ์๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์ดํดํ๊ณ ํจ์ ์ฐธ์กฐ์ ํจ์ ํธ์ถ์ ์ฐจ์ด์ ์ ์ดํดํฉ๋๋ค. ํจ์๋ก์ ์ด๋ค ์ฉ๋๋ก ์ฌ์ฉ๋๋์ง์ ๋ํด์๋ ํผ๋์ด ์์ต๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ๋ ํจ์๊ฐ _์๋๋๋ค_ ํจ์์ ๋์์ ์์ํด์๋ ์ ๋ฉ๋๋ค. ํจ์๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ผ ๋ฟ์ ๋๋ค. ์ด๋ ํด๋์ค๊ฐ ํจ์๋ผ๊ณ ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ํจ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ ๋ถ๋ช ํ ๋ฐฉ๋ฒ์ด ์์๊ธฐ ๋๋ฌธ์ ES6 ์ด์ ์ ํด๋์ค๋ฅผ ์ค๋ช ํ๋ ๋ฐฉ์์ผ ๋ฟ์ ๋๋ค. ํด๋์ค๋ ํจ์์ ์์ฑ์ ์ทจํ์ง ์์ผ๋ฉฐ ํจ์์ฒ๋ผ ํด๋์ค๋ฅผ ํธ์ถํ ์ ์์ง๋ง ES6 ์ด์ ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค๋ฅผ ์ ์ธํฉ๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ๋๋ ๊ทธ ๋ฌธ์ ์ ๋ํ ๋์ ๋ ผ์ ์ ๋ค ์จ๋ฒ๋ ธ๋ค๊ณ ๋๋๋ค. ๋๋ ๋จ์ง ์ ํ์ ํด๊ฒฐํด์ผ ํ ๊ฒ์ด๋ค. ๋ด ์ฝ๋์์๋ ์ผ๊ด์ฑ์ ์ํด ํญ์ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋๋ ์ฌ์ ํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ฌธ์ ๊ทธ๋๋ก ํจ์๋ก ์ทจ๊ธํ๋ ๊ฒ์ด ๋ฏธ๋์ ๋ง์ ์ข์ ์ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง, ๊ทธ๊ฒ์ ๋จ์ง ๋์ ๋๋ค.
@mhegazy ์ด๊ฒ์ ๋ด๊ฐ @jonathandturner ๋ฐ์ฝ๋ ์ดํฐ https://github.com/jonathandturner/decorators/issues/16 ์ ๋ ์ด๊ฒ์ด ์๊ฐํด์ผ ํ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ๋ก์๋ ์ด ๋์์ธ ์ ํ์ด "ES7 Decorator Pitfalls"์ ์ ์ฌํ ์ ๋ชฉ์ ๋ง์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ฃผ์ ๊ฐ ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
@Tharaxis , ์ฒซ ๋ฒ์งธ ์์ ์ ๋์ํฉ๋๋ค. ๋๋ ES7 ์ ์์ด ์ฐ๋ฆฌ๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ์ ๋์์ธํ๋ ๊ฒ์ ๋ฐฉํดํด์๋ ์ ๋๋ค๊ณ ์๊ฐํ์ง ์์ผ๋ฉฐ, ์ฐ๋ฆฌ ๋์์ธ์ ์ด์จ๋ ES7์ ์ ๊ตฌ์ ์ค ํ๋์ ๋๋ค.
"๋ฐ์ฝ๋ ์ดํฐ๋ ํจ์ ์ธ์๊ฐ ์๋๋๋ค"์ ๋ํด ๋ด๊ฐ ํ๋ฆฌ์ง ์์๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋ฐ์ฝ๋ ์ดํฐ ์์ฒด์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ด ์๋๋ผ ๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ฝ๋ ์ดํฐ์ ํจ์์ ๊ตฌ๋ถ์ ๊ด๊ณ์์ด ๋ฐ์ฝ๋ ์ดํฐ _factories_๋ ์ค์ ๋ก๋ ํจ์์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ๋ฌ๊ฐ ์ผ๋ฐ ํจ์์ธ ๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ์ ๋ํ ํธ์ถ์ ์๋์ผ๋ก ์์ฑํ๋๋ก ์์ฒญํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํ๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ตฌ๋ถํ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ ๋๋ค.
๋ํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํจ์๋ก ์ทจ๊ธํ ๋ ์ข์ ์ ์ ์๋น์๊ฐ ๊ทธ๊ฒ์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ ์ฉํ๊ฑฐ๋ ๋จ์ํ ์ ์ ํ๋ค๊ณ ์๊ฐํ๋ ๋๋ก ํธ์ถํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
@JsonFreeman ์ธ์๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ค๋ช ํ๊ณ ํธ์ถํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ ํ์ฌ ์ํฉ์ ์ค์ฌ์ผ๋ก ๋์
๋ด๊ฐ ๋ฌป๋ ๊ฒ์ ์์
๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ @F
๋ฅผ @F()
ํธ์ถ์ ํด๋นํ๋ ๊ฒ์ผ๋ก ๋ฐ๊พธ๋๋ก ํ๊ณ ์ ํ ๊ฒ์ฌ๊ฐ ์ฌ์ฉํ ๋ 0...n ๋งค๊ฐ๋ณ์์ ์ธ์ ๋ชฉ๋ก์ ์๊ตฌํ๋๋ก ํ ์ ์์ต๋๊น ๋๊ดํธ ์๋ ๊ตฌ๋ฌธ. ์๋ง๋ ๋น์ ์ "...ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ตฌ๋ณํ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์
๋๋ค..."๊ฐ ์๋ฏธํ๋ ๋ฐ๋ฅผ ์์ธํ ์ค๋ช
ํ ์ ์์ ๊ฒ์
๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ๋ ํญ์ ๊ณต์ฅ์์ ๋ต์ฅ์ ํ๊ณ , ๊ณต์ฅ๋ช
์ ๋ฐ์ฝ๋ ์ดํฐ ์ด๋ฆ์ธ๋ฐ... ๋ณ๋ก ์ด๋ ต์ง ์์๋ฐ ์ ๊ฐ ์๋ชป ์ดํดํ๊ณ ์๋ ๊ฑด๊ฐ์?
์๋น์๊ฐ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํ๋๋ก ํ์ฉํ๋ ๊ฒ์ ๋ํ ๋ง์ง๋ง ์์ ์ ๋ชจ๋ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์ ์ค๋ช
๋์ด ์์ผ๋ฉด ์ง์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ์ต๋๋ค. <decorator name>(target, name)
์ ๋น๊ตํ์ฌ <decorator name>(<argument list>)(target, name)
ํ๋ฉด ๋ฉ๋๋ค. <decorator name>(target, name)
๋ฅผ ์๋ก ๋ค ์ ์์ต๋๋ค. ํฉํ ๋ฆฌ ์ฌ์ฉ์ ์๋ฌดํํ๋ค๋ ๊ฒ์ ์ ์์ ์๊ฐ ํญ์ ์๋ํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ง ๊ฐ์ ํ์ง ์๋ ๊ฒฝ์ฐ ํ์์ ์๋ ๋๋๋ก ์๋ํ์ง ์์ผ๋ฉฐ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๊ตฌํ๋๋ ๋ฐฉ์์ ์ ์ ์ผ๋ก ์์กดํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ฐ์ฝ๋ ์ดํฐ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ์ ์ ์ง์ ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด ๋ฌธ์ ๋ ๋์ผํ ๊ฒ์ ์ค๋ช ํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์ผ๊ด์ฑ ๋ฌธ์ ๋ก ์ด์ด์ง๋ค๋ ๊ฒ์ ๋๋ค. ํนํ ๊ทธ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ํธ์ถ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ผ ํจ์ ์๋ฏธํ ๋ ํนํ ๊ทธ๋ ์ต๋๋ค. ์ด๊ฒ์ ๋ฆฌํฉํ ๋ง์์ ์ธ์ด ์ผ๊ด์ฑ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ๋ฐฉํดํ๋ ๋ถ์ผ์น์ ๋๋ค.
๋ด๊ฐ ๋ช ๊ฐ์ง ํฌ์คํธ์์ ์ค๋ช ํ ๋ฆฌํฉํ ๋ง ๋ฌธ์ ๋ ์ด๋ฏธ ํ์ฌ ๋ฐฉ๋ฒ์ ๊ฒ์ฌํด์ผ ํ๋ ์ด์ ์ ์ถฉ๋ถํฉ๋๋ค.
์๋ ํ์ธ์, @Tharaxis ๊ฐ ๋งํ ๋ด์ฉ์ ๋ฐ๋ผ ์ผ๋ฐ ์ฌ์ฉ์์๊ฒ 1.5์ผํธ โโ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ํ์ฌ ์ ์์ ๋ง์กฑํฉ๋๋ค.
a) ์ฐ์ฃผ๊ฐ ๊ทธ๊ฒ์ ๋ช
๋ นํฉ๋๋ค.
b) ๋ฐ์ฝ๋ ์ดํฐ๋ ์ํฉ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ์ค์ํ ๊ธฐ๋ฅ์ ์๊ฒ ๋ฉ๋๋ค.
ํ์๋ ๋ฌผ๋ก ๊ฐ์น ํ๋จ์ด๋ฉฐ ๋ต์ ๊ฐ๋ฐ์ ์ ํ(์: ์ผ๋ฐ ์ฌ์ฉ์/์ ๋ฌธ ์ฌ์ฉ์ ๋ฑ)์ ๋ฐ๋ผ ์ด๋ ์ ๋ ๋ฌ๋ผ์ง๋๋ค. ์ ๋ ์ ์ ๋ฒ์ฃผ์ ์ํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ ์ธ์ด์ ํ๋ ์์ํฌ์ ๊ฑธ์ณ ์๊ฒ ํผ์ ธ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋์๊ฒ '์ค์ํ ๊ธฐ๋ฅ'์๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ 2๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ฑํ ์ ์๋ ์ ์ฐ์ฑ์ด ํฌํจ๋์ง ์์ต๋๋ค. ๋ชจ๋ ์ ์ถฉ์์ ์๋ ์กด์ฌํ๋ค๋ฉด ํ๋ฅญํ ๊ฒ์ ๋๋ค.
์ด์์ ์ผ๋ก๋ @F ๋ฐ @F()๊ฐ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๊ตฌํ๋๋ ๋ฐฉ์์ ๊ด๊ณ์์ด ์ผ๊ด๋ ์ ์๋ค๋ฉด ์ข๊ฒ ์ง๋ง ๊ทธ๋ ์ง ์๋ค๋ฉด ํ๋ฐญ์์ ๊ฐํด๋ฅผ ํผํ๋ ๊ฒ๋ณด๋ค ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์์ฑํ ๋ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์ ์ฝ์ ๋ฐ๋ ๊ฒ์ ํจ์ฌ ์ ํธํฉ๋๋ค. ๋ด๊ฐ ๊ทธ๋ค์ ์ฌ์ฉํ ๋๋ง๋ค.
๊ฐ์ฌํฉ๋๋ค & ๊ฑด๋ฐฐ
์ด ์์ฒญ์ ๋ฐ์ฝ๋ ์ดํฐ ํฉํ ๋ฆฌ๊ฐ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ํ์ค์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ๋ ์์ด๋์ด์ ๋ฌ๋ ค ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ด๊ฒ์ด ์ด๋ป๊ฒ ์ฌ์ฉ์๊ฐ ์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๋ ์ฅ์ ์ ์ํ๋ฉด 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) {...}
์ด์จ๋ , ๊ทธ๋ฌํ ์ ๊ทผ ๋ฐฉ์์ด ์๋ฏธ๊ฐ ์๋ ๊ฒ์ผ๋ก ํ๋ช ๋ ์ ์๋ค๋ฉด ์ฃผ์์ด ํจ์์ ๋ชฉ์ ์ ๋ฌธ์ํํ๋ค๋ ์ด์ ์ด ์์ต๋๋ค. ์ฆ ์ฅ์ํฉ๋๋ค.
๊ฑด๋ฐฐ
์ข์ ์ก์ฆ, ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ํ๋ ๋ฐ ๋์์ด ๋๋ ๋ฐ์ฝ๋ ์ดํฐ, Typeception์ ์ฌ๊ฐํ ๊ฒฝ์ฐ.
@JsonFreeman ๋งค๊ฐ๋ณ์๊ฐ 0์ธ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋์ ๋ค์์ (๋์, ์ด๋ฆ) ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ฐ๋์ ์ถ์ ํ ๊ฒ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ต์ํ ๋งค๊ฐ๋ณ์๊ฐ 0์ธ ํจ์๊ฐ ๋ค๋ฅธ ๋ฉ์๋์ ์๋ ํน์ ์ฑ/๋ช ํ์ฑ ์์ค์ ์ ๊ณตํ๊ณ (ํ์์ ๊ฒฝ์ฐ ๋งค๊ฐ๋ณ์๊ฐ ํธ์ถ๊ณผ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์) ๊ทธ ์์ ๋ฌธ์ํํ ๋จ์ผ ๋์์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๋ถํ์ํ ์์ค์ ๋ถ์ผ์น. ๋๋ ๋ํ ์ธ์ง๋ "๊ฐ๋ฅํ" ๋ณต์ก์ฑ์ผ๋ก ์ธํด ํ ๊ฒฝ๋ก๋ก ๊ฐ๋ ๊ฒ์ ๊บผ๋ คํ์ง๋ง, ํ์ฌ ๊ตฌํ์ด ์๋น ์ธก๋ฉด์ ๋ถ๊ณผํ๋ ๋งค์ฐ ์ค์ ์ ์ธ "๋ช ๋ฐฑํ" ๋ณต์ก์ฑ์ ๋น์ถ์ด ๋ณผ ๋ ๋ ๋ง์ ์ค์๋ฅผ ํด์ผ ํฉ๋๋ค. ๊ฐ๋ฅํ ๊ฒ๋ณด๋ค ๋ถ๋ช ํ ๊ฒ.
๋ค๋ฅธ ์ต์
์ @F
๋ก ํธ์ถ๋๋ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ClassDecorator, MethodDecorator, PropertyDecorator ๋๋ ParameterDecorator์ ํจํด ๋๋ ClassDecorator, MethodDecorator, PropertyDecorator๋ฅผ ๋ฐํํ๋ 0..n ์ธ์ ํฉํ ๋ฆฌ ํจ์ ์ค ํ๋์ ์ผ์นํ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค. ๋๋ ParameterDecorator. ๊ทธ๋ฌ๋ ๊ทธ ๊ตฌํ์ด ๋ค๋ฅธ ์ค๋ฅ๋ฅผ ์ผ์ผํค๊ณ (์ถฉ๋ํ๋ ๋ ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ค ๊ฒ์ด ๊ฐ์ฅ ์ ์ผ์นํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๊น?) ์ปดํ์ผ๋ฌ ๋ด์์ ๊ณผ๋ํ ๋ณต์ก์ฑ์ ์ถ๊ฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋จ์ํ @F
ํธ์ถ์ @F()
๊ฒ์ด ๋ ๊ฐ๋จํ ์๋ฃจ์
์ด ๋ ๊ฒ์ด๋ฉฐ ๋ช
์๋ ๋ค์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์
๋๋ค.
์ฃ์กํฉ๋๋ค. ๋ช ํํํ๊ธฐ ์ํด ๊ทํ์ ์๋ฃจ์ ์ด ๋ณต์กํ๋ค๊ณ ์ฃผ์ฅํ ๊ฒ์ด ์๋๋๋ค. ๋๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํ๊ธฐ ์ ์ ์๋์ผ๋ก ํธ์ถํ๋ ๊ฒ์ด ๋ถํฌ๋ช ํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค. ์ฝ์ ๋ ํธ์ถ์ ์ฌ์ฉ์์๊ฒ ๋ณด์ด์ง ์์ผ๋ฉฐ ๋ง์ ์ฌ์ฉ์๊ฐ ๊ธฐ๋ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
ํ์ฌ์ ๋ชจ์ต๋ ๋ณต์กํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ง์ ํ๋ฏ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๋ ์์ ์ ๊ธฐ๋ฅ์ด ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ ์ฉ๋์ด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํด ๋ชจํธํ๊ฑฐ๋ ๋ง์ฐํ ์๊ฐ์ ํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋น์ ์๊ฒ ์ค ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ข์ ๋์๊ด์ ๊ทธ๊ฒ์ ๋ถ๋ช ํ ํ ๊ฒ์ ๋๋ค.
์ ์ํ ์ฒด๊ณ์์ ์๋์ผ๋ก ํธ์ถ์ ์ํํ๋ ๊ฒฝ์ฐ ์๋ณ์ ๋์ ์์์ ๋ฐ์ฝ๋ ์ดํฐ ํํ์์ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? ๊ทธ๊ฒ๋ ํธ์ถ๋๋์?
๋ฌ๋ฆฌ ๋ฌธ์ํ๋์ง ์๋ ํ ์์์ ํธ์ถ์ ๋๋ผ์ธ ์ ์์ง๋ง C# ํน์ฑ ๋ฑ๊ณผ ๊ฐ์ ๊ฐ๋ ์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ์๋ง ํด๋น๋๋ค๋ ์ ์ ๋์ํฉ๋๋ค.
์์์ ๋ฐ์ฝ๋ ์ดํฐ ํํ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ข์ ์ก์ฆ, ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ํ๋ ๋ฐ ๋์์ด ๋๋ ๋ฐ์ฝ๋ ์ดํฐ, Typeception์ ์ฌ๊ฐํ ๊ฒฝ์ฐ.
๊ณต์ ํ ์ ํ. ์ฃผ๋ง ์คํ ๋ฆ์ ์๊ฐ์ ์ ๋๋ก ์๊ฐํ์ง ๋ชปํ ์๊ฒฌ์ ์ ์ํ๋ ๋ฐ ์ ํฉํฉ๋๋ค. ๊ตํ์ ์ป์๋ค. ์ธํฐ๋ท.์คํ ์ทจ์().
๋ด ์์ ์ ์ผ๊ด๋ ํธ์ถ ์ฌ์ดํธ ๊ตฌ๋ฌธ์ด ํฉํ ๋ฆฌ ์ฌ์ฉ์ ์๋ฌดํํ๋ ๊ฒ์ผ๋ก ํ๋ช ๋๋ฉด ๊ทธ ์ด์์ผ๋ก ๋ง์กฑํ๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ์์ฌ ํ ์ฌ์ง์์ด ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค. ๋ค์ ํ ๋ฒ ๋๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ๋ณต๋๋ ๊ณ ํต๋ณด๋ค ์ฝ๊ฐ์ ๊ณ ํต์ ์ ํธํฉ๋๋ค(์ด ์์ ์์ ์ ์ฌ์ ์ธ ๊ณ ํต์ด์ง๋ง). ๋ค๋ฅธ ์ฌ๋๋ค์ ๋์ํ์ง ์์ ๊ฒ์ ๋๋ค.
API ํฅ์์๋ ๋ฌธ์ ๊ฐ ์์ง ์์ต๋๊น? ํฉํ ๋ฆฌ ์์ด ์์ฑ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ ๋์ค์ ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฏ๋ก ๋ฏธ๋์ @F
๋ฐ @F2()
๋ฅผ ์์ธกํฉ๋๋ค.
๋๋ ๋ํ f
๋ฐ f()
์ฌ์ฉํ ๋ ์ด ์๋๋ฆฌ์ค๋ฅผ ์ป์ ์ ์๋ค๋ ๊ฒ์ ์์ง ๋ชปํฉ๋๋ค. ์ด๋ค์ ์๋น ์ธก๋ฉด์์ ์๋ก ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ์ ๊ฒฝ์ฐ์๋ ํญ์ ๋์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉ/ํธ์ถํ๊ณ ์์ผ๋ฉฐ ํญ์ ๋ฐฐํ์์ ๋ฉ์๋ ํธ์ถ์ด ์งํ๋๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋์๊ฒ ์ด๊ฒ์ ํต์ฌ์ ์ฌ์ฉ์ฑ ๋ฌธ์ ์ ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํ ๋ ์์ฑ์๊ฐ ๊ตฌํํ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ํด Google์ ๊ฒ์ํ ํ์๊ฐ ์์ต๋๋ค. ํจํค์ง์ด ์๋๋ผ ๋์์ ๊ด์ฌ์ด ์์ต๋๋ค.
๊ฑด๋ฐฐ
์์ฝํ ๋ง์ง๋ง ๋ฉ๋ชจ๋ง ๋จ๊ธฐ๊ณ ์กฐ์ฉํ ํ๊ฒ ์ต๋๋ค. ์์ปจ๋, ์ด๊ฒ์ ์ ๋ง๋ก ์ ์๊ฒ ์์ด ์ธํฐ๋์ ๋์์ธ ๋ฌธ์ ์ผ ๋ฟ์ ๋๋ค. ๋๋ ์ธ๋ถ์์ ๋์์ธ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ณด๊ณ ์ถ์ง๋ง ๊ทธ ๋ฐ๋๋ ์๋๋๋ค.
UI/UX ์ ๋ฌธ๊ฐ๋ก์ ์ ๋ ์ด๊ฒ์ ๊ฝค ์์ฃผ ๋ด ๋๋ค. ์ ๋ ์ฌ์ฉ์์๊ฒ ํผํด๋ฅผ ์ค ์ ์๋ UI ์๋ฃจ์ ์ ์ ์ํ ์ฌ๋ฅ ์๋ ๊ฐ๋ฐ์์ ํจ๊ป ์ผํ์ต๋๋ค(ํ ๊ฐ์ง ์๋ ํธ๋์ญ์ ๋ณต์ก์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ํ ๊ฒฝ์ฐ์ ๋ ๊ฐ์ ์ ์ฅ ๋ฒํผ์ด์์ต๋๋ค. ๋ค์ ๋๋ํ ์ฌ๋๊ณผ ์ข์ ์ฌ๋). ๋ณต์กํ ๊ตฌํ ์ธ๋ถ ์ฌํญ ๋ ผ๋ฆฌ์ ๋ํด ๋ฌด๋ฆ์ ๊ฟ๊ณ ์์ ๋ ์๊ณ ์๋ ๊ฒ์ ์๊ณ ์ผ๋ฐ ์ฌ์ฉ์์ ๋์ผ๋ก ๋ณด๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด์ ๋ด๊ฐ ํ๊ท ์ ์ผ๋ก ์์ ํ ํ๋ ธ๊ฑฐ๋ ๋ณต์ก์ฑ์ด ํ์ฌ ๋์์ธ์ ์๊ตฌํ๋ค๋ฉด ๋ชจ๋ ๊ฒ์ด ์ข๋ค๋ฉด, ๋๋ ๊ทธ์ ์ ์ ์ ์ฐจ๋ฆฌ๊ณ ๋ฐฐ์์ผ ํ ๊ฒ์ ๋๋ค.
๊ฑด๋ฐฐ
๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์๋ณ์๊ฐ ์๋๋ผ ๋ค๋ฅธ ํํ์์ธ ๊ฒฝ์ฐ ์๋์ผ๋ก ํธ์ถํ์๊ฒ ์ต๋๊น? ์๋ฅผ ๋ค์ด ๋ฐ์ฝ๋ ์ดํฐ๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋์ฒด ํจ์ ํํ์์ผ๋ก OR ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒ:
@(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;
}
๋ฒ์ ์์๋ฅผ ๋ฐ๋ฅด๋ฏ๋ก ๋ชจ๋ ์์ฑ/๋ฉ์๋๋ฅผ ๋จผ์ ์ ์ธํ ๋ค์ ํด๋์ค 1์ ๋ฐ๋ฆ ๋๋ค. ์ฆ, B, C, D, E, F, A.
์ฌ๊ธฐ ์์ ์์ฑ๋ ์ฝ๋๋ฅผ ๋ณผ ์
ํ์ฌ ๋งค๊ฐ๋ณ์ ์์ฑ์ ์ฅ์ํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ง์๋ ์ ์์ต๋๊น?
๋งค๊ฐ๋ณ์ ์์ฑ์ 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์ ์์ธํ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค.
๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๋ฐ์ฝ๋ ์ดํ ๋๋ ์ ํ์์ ๋ฐ์ฝ๋ ์ดํธ๋ ๊ฒฐ๊ณผ ์ ํ์ ๋ณ๊ฒฝํ ์ ์๋ ์ด์ ๋ฅผ ์ฌ์ญค๋ด๋ ๋ ๊น์?
์๋ฅผ ๋ค์ด MethodDecorator๋ ๋ค์๊ณผ ๊ฐ์ด ๋์์ ์ผ๋ก ์ ์๋ ์ ์์ต๋๋ค.
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
๋ ์ฌ๊ธฐ์์ ์ ํจํ ์ฃผ์ฅ์ด ์๋๋๋ค. IMHO. ์ฒซ์งธ, JavaScript์ ๋ฐ์ฝ๋ ์ดํฐ๋ ํด๋์ค/ํ๋ ์ ํ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก TS์ JS ๊ฐ์ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋์งธ, ๋ฐ์ฝ๋ ์ดํฐ๋ ์ ์ ์ผ๋ก ์ ์ฉ๋๋ฉฐ, TS ์ปดํ์ผ๋ฌ๋ ์ ์ ์ฌ์ดํธ์์ ์๋ ํ๋ ์ ํ๊ณผ ๋ฐ์ฝ๋ ์ดํธ๋ ํ๋ ์ ํ์ ์ถ๋ก ํ ์ ์์ต๋๋ค.
@HerringtonDarkholme ๋๋ ์ด๊ฒ์ ๋ค๋ฅธ ์ ์์์ ์ถ์ ํด์ผ ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์ฃผ๋ ์ด์ ๋ ์ ํ์ ๋ํ ์ปดํ์ผ๋ฌ์ ์ด์ ๊ฐ ์ ์ธ์ ํตํ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ํ์ด ์ ์ธ๋๋ฉด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๋ฏน์ค์ ์ ํ ๋ฎคํ ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ํธ์ด ๋ง์์ง ์ ์๋ ์ ์ธ์ ํด๊ฒฐํ ๋ ์ด๋ฅผ ํด๊ฒฐํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
@mhegazy ๊ทธ๋์, ์ด๊ฒ์ ์๋์ ์ธ ์ค๊ณ๊ฐ ์๋๋ผ ๊ตฌํ ์ฉ์ด์ฑ์ ์ํ ํํ์ผ๋ก ์ดํดํ ์ ์์ต๋๊น?
์ด ์ ์ ์ ๋ฐ๋ฅด๋ฉด ๋ฐ์ฝ๋ ์ดํฐ๋ ์ ์ธ์ ๊ตฌ๋ฌธ์ ์ ์งํ๋ฉด์ ๋์์ธ ํ์์ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๊ธฐ๋ฅ์ ๋ณต์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์ ์ฝ๋๋
๋ฏธ๋์ JavaScript์์๋ ์ ํจํ์ง๋ง ์ค๋๋ ์ TypeScript์์๋ ์ ํจํ์ง ์์ต๋๋ค.
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
ํ์ดํ๊ณผ ๊ฐ์ ์ ์ฌํ ์ด์ผ๊ธฐ๊ฐ ์๋์ ํ์ธํ๊ณ ์ถ์ต๋๋ค.
ํ์ฌ ํ์ธ์ ๋์์ ํ ๋นํ ์ ์๋ ๋ฐ์ฝ๋ ์ดํฐ์์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐํํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ฝ๋ ๋ถ๋ถ์ ์ ํ์ ๋ํ ์ถ๊ฐ ์ฌํญ์ ์บก์ฒํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํด ์ค์ ๋ก ์๊ฐํ ์ ์ด ์์ต๋๋ค. ๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ด ์ ๋นํ ์ ์์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๊ทธ๊ฒ์ ๊ตฌํํ๋ ๋ฐ ๋๋ ๋น์ฉ์ด ๋งค์ฐ ๋์ ์ ์์ต๋๋ค.
์ด์์ ์ผ๋ก๋ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๋ฐํํ๋ ์ ํ์ด ๋์๊ณผ ๋์ผํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ ๋น์ ์์ค ๋๋ ๋์ ์์น์์ ๋ฐ์ฝ๋ ์ดํ ๋ ์ ํ์ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ ์ ์ ์์ต๋๋ค.
๋๋ ์ ๋ง๋ก ์ฐ๋ฆฌ๊ฐ ๋ฐ์ฝ๋ ์ดํฐ ๋ฐํ ์ ํ๊ณผ ํ๊ฒ์ ๋ณํฉํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ผ์ข ์ ๋ฏน์ค์ธ(mixin)๊ณผ ๊ฐ์ต๋๋ค.
๋ช ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ ์์ด๋์ด์ ๋๋ค. TypeScript ์ปดํ์ผ๋ฌ ์ถ๋ ฅ์ด JavaScript์ด๊ธฐ ๋๋ฌธ์ Xtend ์ ๊ฐ์ Java์ฉ ์ ์ฌํ ์ธ์ด๊ฐ ์์ต๋๋ค.
์ด ํ๋ก์ ํธ์ ๋ํ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์์ด๋์ด์ ๋ํด ๋ฐฐ์ธ ์ ์์ต๋๋ค. ํ์ฑ ์ฃผ์์ ์ฐพ์ต๋๋ค. "ํ์ฑ ์ฃผ์์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด Xtend ์์ค ์ฝ๋๋ฅผ Java ์ฝ๋๋ก ๋ณํ ํ๋ก์ธ์ค์ ์ฐธ์ฌํ ์ ์์ต๋๋ค."
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด TypeScript ์ถ๋ ฅ์ ์ ์ดํ๋ โโ๊ฒ์ ์ ๋ง ์ข์ ๊ธฐ๋ฅ์ ๋๋ค!
์ธํฐํ์ด์ค์ฉ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
@shumy ๋ฌธ์ ๋ ์ธํฐํ์ด์ค๊ฐ ๋ฐํ์์ ์กด์ฌํ์ง ์์ผ๋ฉฐ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๋ฐํ์์๋ง ์คํ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ฐํ ๊ฐ๊ณผ ๊ด๋ จํ์ฌ ์์ฑ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ฉ์๋ ๋ฐ์ฝ๋ ์ดํฐ์ ๋ค๋ฅด๊ฒ ์ทจ๊ธํ๋ ์ด์ ๊ฐ ์์ต๋๊น? (๋ฐ๋ฒจ์ ๊ทธ๋ ์ง ์์ต๋๋ค).
๋ด ๋ง์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด ์์ฑ์ ๋ํ ๊ธฐ๋ฅ์ ์ ์ํ๋ ค๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
function decorator(proto, name) {
Object.defineProperty(proto, name, { value: 42 });
}
class Foo {
<strong i="7">@decorator</strong>
a: number;
}
Babel์ ์ค๋ช ์๋ฅผ ๋ฐํํด์ผ ํ๋ ๋ฐ๋ฉด:
function decorator(proto, name) {
return { value: 42 };
}
class Foo {
<strong i="11">@decorator</strong>
a;
}
์ด๊ฒ์ Babel์์ ์ฌ์ฉ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ์ธ TypeScript์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
์์ฑ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ฉ์๋ ๋ฐ์ฝ๋ ์ดํฐ์ ๋์ผํ๊ฒ ์ทจ๊ธํ๊ณ ๋ฐ์ฝ๋ ์ดํฐ์ ๋ฐํ ๊ฐ์ Object.defineProperty
๋ฅผ ํตํด ์ ์ฉํด์ผ ํ๋ค๊ณ ์ ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ํ ๋ฉ์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋จ์ผ ์์ฑ์ ์ฌ๋ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ์ฉํฉ๋๋ค.
ํ์ฌ (Babel ํธํ์ฑ์ ์ํ) ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์ฑ์ ์ค์ ํ๋ ๊ฒ ์ธ์๋ ๋ฐ์ฝ๋ ์ดํฐ์์ ์ค๋ช ์๋ฅผ ๋ฐํํ๋ ๊ฒ์ด์ง๋ง ๋ถํ์ํ๊ฒ ๋ญ๋น๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
function decorator(proto, name) {
var d = { value: 42 };
Object.defineProperty(proto, name, d);
return d;
}
@mhegazy ์์ ๋ด ์๊ฒฌ์ ๋ํ ํต์ฐฐ๋ ฅ์ด ์์ต๋๊น?
@sccolbert TypeScript ์์ ๋ฐ์ดํฐ ์์ฑ์ ๋ฐ์ฝ๋ ์ดํฐ์ ๋ํ ์์ฑ ์ค๋ช ์์ ์ฌ์ฉ์ ํ์ฉํ์ง ์๊ธฐ๋ก ์ ํํ์ต๋๋ค. ์ค๋ช ์๊ฐ ์ง์ ํ "๊ฐ"์ด ์ธ์คํด์ค๊ฐ ์๋ ํ๋กํ ํ์ ์ ์ค์ ๋๋ค๋ ์ฌ์ค ๋๋ฌธ์ ๋ฐํ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. . ์์ ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง ๋ค์์ ๊ณ ๋ คํ์ญ์์ค.
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 (!)
์์ฑ์ ๋์ ํ๊ฐ๋ ์ค๋ช ์์ "์ด๊ธฐํ" ์์ฑ์ ์ง์ํ๋ ES์ ๋ฏธ๋ ๋ฒ์ ์ ๋ํ ์ ์์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ์ด ํ๋กํ ํ์ ์ ์ค์ ๋๋์ง ๋๋ ์ธ์คํด์ค๋ณ๋ก ํ ๋น๋๋์ง ์ฌ๋ถ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
์ง๊ธ์ ์ฃผ์์ ์์ ๋ฐ๋ผ Object.defineProperty
์ง์ ํธ์ถํ์ฌ ์ด ์ ํ์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์์ผ๋ก ์ด ์ ํ์ ์ํํ ์ง ์ฌ๋ถ๋ฅผ ๊ณ์ ์กฐ์ฌํ ๊ฒ์
๋๋ค.
@rbuckton ๊ฐ์ฌํฉ๋๋ค! ๊ฐ์ ์๋ฏธ๋ก ์๋ ดํ๊ธฐ ์ํด Babel๊ณผ ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น? ๊ทธ๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ฒ ๊ฐ์์.
ํน์ ์ธ์คํด์ค์ ๋ํ ๊ฐ์ ์ง์ ํ๊ธฐ ์ํด ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ์ฉํ๊ฐ์? ์์ฑ ์ด๋์ ๋ผ์ด์ ๊ฐ ๊ทธ๋ฐ ์ฉ๋๊ฐ ์๋๊ฐ์?
๋ด ์ฌ์ฉ ์ฌ๋ก๋ ์์ ๋ณด๋ค ๋ ๋ณต์กํฉ๋๋ค. ์ค์ ๋ก ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ์ this
์ปจํ
์คํธ์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ getter๋ฅผ ์ ์ํ์ฌ ํด๋น ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ์ ์๋ ์ธ์คํด์ค์ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค.
๋น์ ์ ๋ชจ๋ฐฉ๋ก ์๊ฐํ ์ ์์ต๋๋ค ์ค๋ช
ํ๋กํ ์ฝ์ ๋ฐฉ๋ฒ์๊ฒ ์ ๊ทผ ํ์ด์ฌ์์ 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
์์ฑ์ ์ก์ธ์คํ๋ฉด ์์ ์์ this
์ปจํ
์คํธ์ ๋ฐ์ธ๋ฉ๋ ISignal
๊ตฌํ์ด ๋ฐํ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ํธ๊ฐ ์ ์๋ ์ธ์คํด์ค๋ฅผ ๋ค์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
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์์๋ ์ฌ์ฉํ ์ ์๋ ์์ฑ ์ค๋ช
์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
9์ 4์ผ 2015๋
2:03 PM, "Koloto" [email protected] a รฉcrit :
@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
@DavidSouther ๋ธ๋ผ์ฐ์ ๋ ์์ง ํ๋ก์๋ฅผ ์ง์ํ์ง ์์ต๋๋ค :(
@cybrown ์, ๋ฉ์๋ ๋ฐ ์ ๊ทผ์์ ๋ํ ์์ฑ ์ค๋ช ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ ์์ฑ(์ ๊ทผ์๊ฐ ์๋ ํ๋)์์๋ง ํ ์คํธํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ฑ(์ ๊ทผ์ ์์) ๋ฐ ํด๋์ค์ ๋ํด ES3์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ์ฉํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ES3๋ฅผ ๋์์ผ๋ก ํ ๋ ๋ฉ์๋์ ๊ฐ์ง ์์ฑ ์ค๋ช
์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. { writable: true, enumerable: true, configurable: true }
์ ๊ฐ์ ๊ฒ์
๋๋ค. ๊ทธ๋์ ES3๋ฅผ ์ง์ํ์ง ์์ ์ด์ ๊ฐ ์์ต๋๋ค.
@sccolbert ์๊ฒ ์ต๋๋ค . ๊ทธ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ง๋ถ์ฌ์, TypeScript๋ ๊ธฐ๋ฅ๊ณผ ๋ฉ์๋์ ๋ํ ๊ฐ์ ๋ _this_ ํ์ดํ ์์ ์ ํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋์์ด ๋์ง ์์๊น ์ถ์ต๋๋ค. ํ์ดํ์ด ๋ฌธ์ ๊ฐ ์๋๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ฐํ์ ์๋ฏธ๋ก ์ ๋๋ค.
@JsonFreeman ๊ฐ์ ๋ _this_ ํ์ดํ์ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์์ ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฝ๋๋ค. ๊ทธ๊ฒ์ ๋ํด ๋ ๋ง์ ์ ๋ณด๊ฐ ์์ต๋๊น?
_this_ ํ์ดํ์ ๋ํ ๊ฐ์ฅ ๋ฐ์ ๋ ํ ๋ก ์ #3694์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฑด๋ฐฐ!
์ค๋ฅ TS1207: ๊ฐ์ ์ด๋ฆ์ ์ฌ๋ฌ get/set ์ ๊ทผ์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
<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){...}
Getter ๋ฐ setter๋ Obect.defineProperty์ ๋ํ ํ ๋ฒ์ ํธ์ถ๋ก ์ ์๋ฉ๋๋ค. ์ด๊ฒ์ ์คํ๋ ค js์ ๋จ์ , set๊ณผ get์ ์ ์ธ์ ๋ณ๊ฐ์ด์ง๋ง ์ค์ ๋ก๋ ๋์ผํ ์์ฑ ์ ์ธ์ ๋๋ค. ์ปดํ์ผ๋ฌ์ ์ค๋ฅ ๊ฒ์ฌ๋ ์ฌ์ฉ์๊ฐ ๋ณ๋๋ก ์๊ฐํ ๋ ๊ฒฝ๊ณ ํ๋ ๊ฒ์ ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ๋ ์์ฑ ์ค๋ช ์์ ํ ๋ฒ๋ง ์ ์ฉ๋ฉ๋๋ค.
์ปดํ์ผ๋ฌ๊ฐ ๋์ผํ ์ด๋ฆ์ get ๋ฐ set์ ๊ฐ์งํ๊ณ ๋จ์ผ Object.defineProperty๋ก ๊ฒฐํฉํ ์ ์์ผ๋ฏ๋ก ๋ฐ์ฝ๋ ์ดํฐ๋ ๊ฒฐํฉํ์ง ์๋ ์ด์ ๊ฐ ๊ถ๊ธํฉ๋๋ค.
๋๋ ์ปดํ์ผ๋ฌ์๊ฒ ์ด๋ค์ ๊ฒฐํฉํ๊ณ ์ค๋ฅ๋ฅผ ๋์ง๋ ๋์ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ๋จ๊ธฐ๋๋ก ์ง์ํ๋ ์ต์
ํ๋๊ทธ์ผ ์ ์์ต๋๋ค.
๊ฐ์ฌ ํด์
@TakoLittle : ์ค๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ํ์ง ์๋ ์ด์ ๋ ๋ถ๋ถ์ ์ผ๋ก ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๊ตฌ์ฑ๋๋ ๋ฐฉ์ ๋๋ฌธ์ ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ๋ ์ํ ํจ์ ๊ตฌ์ฑ๊ณผ ๋์ผํ ์์น์ ๋ฐ๋ฆ ๋๋ค. ์ฌ๊ธฐ์ (_f_ โ _g_)(_x_)๋ _f_(_g_(_x_))๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ฐ์ ์๋ฏธ์์ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ ์ ์์ต๋๋ค.
<strong i="7">@F</strong>
<strong i="8">@G</strong>
class X {}
๋๋ต:
F(G(X))
getter์ setter๋ฅผ ๋ชจ๋ ์ฅ์ํ๋ฉด ๋ฐ์ฝ๋ ์ดํฐ์ ๊ตฌ์ฑ์ด ๋ฌด๋์ง๋๋ค.
class C {
<strong i="15">@F</strong>
set X(value) {}
<strong i="16">@G</strong>
get X() {}
}
์ฌ๊ธฐ์ F
๋ฐ G
๋ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๋์? ์์ ํ ๋ฌธ์ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๊น(์: F(G(X))
)? getter ๋ฐ setter์ ๋ํ ๊ฐ ๋ฐ์ฝ๋ ์ดํฐ ์ธํธ๋ ๊ฐ๋ณ์ ์ด๋ฉฐ ๋ฌธ์ ์์(์: G(F(X))
)๋ก ์คํ๋ฉ๋๊น? get
๋ฐ set
ํน์ ์์๋ฅผ ์์ํฉ๋๊น(์ฆ, get
ํญ์ set
์์ ์๊ฑฐ๋ ๊ทธ ๋ฐ๋์)? ์ฌ์ฉ์๋ฅผ ๋๋ผ๊ฒ ํ์ง ์๋ ๊ฐ์ฅ ์ผ๊ด๋ ์ ๊ทผ ๋ฐฉ์์ 100% ํ์ ํ ๋๊น์ง ๋๋ ECMA-262 ๋ด์์ ์ต์ํ 2๋จ๊ณ ์ด์ ์์ฉ ๊ฐ๋ฅํ ๋ฐ์ฝ๋ ์ดํฐ ์ ์์ ์ผ๋ถ์ธ ์ ๋ฌธ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ด ์์ ๋๊น์ง๋ ๋ค์์ ์ํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ์ ํ์ ์ด๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋์ ๋์ง ์๊ณ ๋ฐํ์์ ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋์
ํ์ง ์๊ณ ๋์ค์ ํด๋น ์ ํ์ ์ํํ ์ ์์ต๋๋ค.
@rbuckton ์ค๋ช
๋๋ฌด ๊ฐ์ฌํฉ๋๋ค
TSํ ์๊ณ ํ์
จ์ต๋๋ค!! ^^d
์ด์ ๋ํ ๋ฌธ์๋ ์ด๋์ ์์ต๋๊น? ๊ตฌํ ์ปค๋ฐ์ ์ฐ๊ฒฐํ์๊ฒ ์ต๋๊น?
๊ฐ์ฌ ํด์.
@mhegazy ์ฌ์์ ์ต์ ๋ฒ์ ๊ตฌํ ์ํ๋ ๋ฌด์์ ๋๊น? ๋๋ ๊ฑฐ๊ธฐ์ ์ฝ๊ฐ์ ๋ณํ๊ฐ ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ์ ์์ ์๋ ๋ฒ์ ์ ์ถ์ ํ์ต๋๋ค. ์๋ฃ๋์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํฉ๋๋ค. ์ฌ์์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ก์ด ๋ฌธ์ ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ชจ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํฉ๋๋ค. ๋๋ ๊ทธ ์ ์์ด ์ง๊ธ ์ฐ๋ฆฌ๊ฐ ๋ฐ์ด๋ค ์ค๋น๊ฐ ๋์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์๋ก์ด ์ ์์ ๋ํด @wycats ์ ๊ธด๋ฐํ ํ๋ ฅํ๊ณ ์์ต๋๋ค.
@omeid , https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md ์์ ์ค๋ช ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
@mhegazy ์ ๋ฐ์ดํธํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ณ์ ์ ๋ณด๋ฅผ ๋ฐ๊ณ ์ถ์ต๋๋ค. ์ฌ์ ์ ๋ฐ์ดํธ์ ๋ํ ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค ๋ ์๋ฆผ์ ๋ฐ๊ณ ํ๋ก์ฐํ ์ ์๋๋ก ์ฌ๊ธฐ์ ๋งํฌํ์ญ์์ค. Aurelia ์ปค๋ฎค๋ํฐ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ฉฐ ์ ๋ฐ์ดํธ ์ TypeScript ๋ฐ Babel๊ณผ ๋๊ธฐํํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ๋ค์ ํ ๋ฒ, TS ํ์ด ํ๊ณ ์๋ ํ๋ฅญํ ์ผ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๊ธฐ๋ฅ ์ฅ์์ ๋ฌผ๋ก ํ์ํฉ๋๋ค.
์ฝ๋์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฅ์ํ ๊ณํ๋ ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ธฐ๋ฅ ์ฅ์์ ๋ฌผ๋ก ํ์ํฉ๋๋ค.
์ฝ๋์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฅ์ํ ๊ณํ๋ ์์ต๋๊น?