ES7ææ¡
ãã³ã¬ãŒã¿ã®ES7ææ¡ã¯ããã«ãããŸãïŒ https ïŒ
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() {
}
ç§ã¯æ£ããã§ããïŒ
åã®ã·ãªã¢ã«åã¯RESTåŒæ°ã§ã©ã®ããã«æ©èœããŸããïŒ
@F()
class Foo {
constructor(...args: string[]) {
}
}
function F(<strong i="6">@paramterTypes</strong> types?: Function[]) {
return function (target) {
target.paramterTypes = types; // ???
}
}
ãã³ã¬ãŒã¿ã®äœ¿çšã¯ç°¡åã«æããŸããããã³ã¬ãŒã¿ã®å®£èšã«é¢ããã»ã¯ã·ã§ã³ã¯çŽãããããšæããŸããã C.4ã¯ããã³ã¬ãŒã¿ã«@decorator
泚éãä»ããå¿
èŠããããšè¿°ã¹ãŠããŸãããå®éã«ãããèµ·ãã£ãŠããããšã瀺ãäŸã¯1ã€ããããŸããã
ãã³ã¬ãŒã¿ãã¡ã¯ããªã¯ãBã«ããã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã¯ã©ã¹ã«ãªãããšãç®çãšããŠããŸããïŒ
CoverMemberExpressionSquareBracketsAndComputedPropertyNameã®è§£éãæŽç·Žããããã®ã«ãŒã«ã¯äœã§ããïŒ
ããŸããŸãªãã€ã³ãã§å€ãã®åæå®ã«Function | Object
ãããããšã«æ°ä»ããŸãããããããã¯åãã§ãã¯æã«ãªããžã§ã¯ãã«çž®éããŸãã ããã«æ©èœãããçç±ã¯äœã§ããïŒ
ç§ã¯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 ES7JavaScriptãã³ã¬ãŒã¿ãžã®ãªã³ã¯ãè¿œå ãããŸããã
ãããã¯ã©ã¹ã ãã®ãã®ã«ãªã£ãã®ã¯æ²ããããšã§ã...
ãŸããã¢ã³ããšã³ããã³ã¬ãŒã¿ã¯ã¹ã³ãŒãããå€ããŸãããïŒ
é¢æ°ã®ææ¡ãå«ã@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ã§ã¯åŒã§ããã¯ã©ã¹å®£èšextendå¥ã®å Žåãšåãåé¡ã§ãã çµæã¯ã¯ã©ã¹å®£èšãæã¡äžããã®ã§ã¯ãªããã·ã³ãã«ã ãã§ããïŒvar宣èšã«äŒŒãŠããŸãããé¢æ°å®£èšã«ã¯äŒŒãŠããŸããïŒ
Oupsã¯ããã«ã€ããŠèããŠããŸããã§ãã@mhegazyã«æè¬ããŸãã
ãã ããé¢æ°éšåãå
ã®@jonathandturnerææ¡ãå®å
šã«æŸæ£ããçç±ã«ã¯ã次ã®ã«ãŒã«ããããŸããã
decorated function declarations cannot be hoisted to the containing scope
å·»ãäžããç·©ããããšã¯ç¢ºãã«æ¬ ç¹ã§ãããä»ã®æ§æã®ãŠãŒã¹ã±ãŒã¹ãããå Žåã«ã¯ã©ã¹ã®ã¿ã®æ©èœã«å€æããããšã¯æ害ãäžããå¯èœæ§ããããŸãã
å¿ èŠãªäžé£ã®å¶çŽãäœãæå³ããŠããã®ããèŠãŠã¿ãŸãããã
ããã«ã€ããŠç§ãèŠãããšãã§ããå¯äžã®è§£æ±ºçã¯æ¬¡ã®ãšããã§ããé¢æ°ãã³ã¬ãŒã¿ã®å Žåã @identifier
圢åŒã®ãã®ã®ã¿ãèš±å¯ããŸãã å·ŠåŽã®è¡šçŸã¯èš±å¯ãããŠããŸããã ããã«ãèå¥åã¯é¢æ°å®£èšïŒè£
食ãããé¢æ°ãå«ãïŒãžã®çŽæ¥åç
§ã§ããå¿
èŠããããŸãã ã¹ã³ãŒãå
ã§è¡ããããã¹ãŠã®æ©èœè£
食ã¯ãé©çšãããé åºã§ã¹ã³ãŒãã®äžéšã«è¡šç€ºãããå¿
èŠããããŸãã
å·»ãäžãèŠåãç Žãåé¡ã¯ããããé©ãã¹ãããšã§ãã ãã°ããã®éjavascriptãæžããŠããå Žåãåå¥çã«å®£èšãããåã«é¢æ°å®£èšãå©çšå¯èœã§ãããšæåŸ ããŸãã äžèŠåçŽãªæ§æããŒã«ãŒïŒãã³ã¬ãŒã¿ãŒïŒãè¿œå ããããšã«ãããé¢æ°å®£èšã®ãã®åºæ¬çãªæ§è³ªãå€æŽãããŸãã
ããã¯èšã£ãŠãã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ã«é©çšããããŸã§ã«è£ 食ãããŸããã
ãããã£ãŠã次ã®ãããããéžæããå¿ èŠããããŸãã
ç§ã¯ãããã®ã©ã¡ãã奜ãã§ã¯ãããŸããããä»ã«äœãå¯èœã ãšã¯æããŸããã
ããã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ã䜿çšããŠExpressã®ã©ãããŒãäœæããŸããïŒãã ããä»»æã®Webãã¬ãŒã ã¯ãŒã¯ããµããŒãã§ããã¢ããã¿ã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ãããŠããŸãïŒïŒ https ïŒ
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[]){ ... }
@jonathandturnerãããã§èª¬æããŠããããšãè¡ãæ¹æ³ãæ¢ããŠã
@cmichaelgrahamã¯ããå®è¡æåæ å ±ïŒAtScriptã§èª¬æãããŠããrttiïŒããããšãã€ã³ããã¹ãã¯ã·ã§ã³ãªã©ã®å®å šã«åé¢ãããæ©èœã§ãã£ãŠãããã®ãããªäœ¿çšæ³ã«ã¯æé©ã§ãã
@cmichaelgrahamhttps ïŒ //github.com/Microsoft/TypeScript/pull/2589ãã芧ãã ãã
@cmichaelgrahamãã³ã¬ãŒã¿ãšé£æºããã¡ã¿ããŒã¿APIãè¿œå ããES7ã®ææ¡ã«åãçµãã§ãããªãã£ã«ãååšããå¿ èŠããããŸãã
@rbuckton @cmichaelgrahamããšããšã¯ãè£
食ãããŠããã¿ãŒã²ããã«åºã¥ããŠããã³ã¬ãŒã¿ã«åãæ¿å
¥ããããã³ã³ãã€ã©ã«æ瀺ããç¹å¥ãªTypeScriptãã³ã¬ãŒã¿ã®èšèšããããŸããã @parameterTypes
ã ã£ããšæããŸããããäžè¬çãªã¡ã¿ããŒã¿APIãåªå
ããŠããã®æ©èœãåé€ãããŠãããšèããã®ã¯æ£ããã§ããïŒ ãããããªããç§ã¯ããããµããŒãããŸãã
TypeScriptã«é¢ããŠãã®ç¶æ³ã«ã€ããŠå°ã話ããŠããã ããŸããã 1.5ã®ãªãªãŒã¹ã¯äºå®ãããŠããŸããïŒ ãããããªããã³ã³ãã€ã©ãªãã·ã§ã³ã¯ã©ã®ããã«ãªããŸããïŒ äŸ¿å©ãªããšã®1ã€ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒçœ²åã®ã¿ã®åã¡ã¿ããŒã¿ãã³ã³ãã€ã©ãŒã«èªåçã«çæãããããšã§ãã
@EisenbergEffectãã³ã¬ãŒã¿ã¯1.5ã®äžéšã§ãããææ°ãªãªãŒã¹ã®1.5-alphaã§äœ¿çšãéå§ã§ããŸãã
ã¡ã¿ããŒã¿ã®ãµããŒãã«ã€ããŠã @paramtypes
ã®åœåã®ææ¡ä»¥éãèšèšãå€æŽãããŸããã æ°ããèšèšã§ã¯ãReflect.metadaããããŒã¶ã«ã䜿çšããŠããŸãã åäœã®è©³çŽ°ã«ã€ããŠã¯ãïŒ2589ãåç
§ããŠãã ããã ãŸãã @ rbucktonã«ã¯ãããã§ã¡ã¿ããŒã¿ãæ¶è²»ããããã®ããªãã£ã«ããããŸãïŒ https ïŒ
@mhegazyç§ã¯ãããç¥ã£ãŠããŸãã ãããåç §ããŠãã ããïŒ http ïŒ
ã¡ã¿ããŒã¿ã®ææ¡ã«ã粟éããŠããŸãã ç§ã¯ããã«ã€ããŠãã£ãŒãããã¯ãæäŸããŠããŸããã å
ã®@parameterTypes
ã¢ã€ãã¢ãåé€ãããŠãããã©ãããç¥ãããã£ãã ãã§ãã
å ±æããŠããã@EisenbergEffectã«æè¬ããŸãã ïŒ+1ïŒ
ã¯ãã @paramtypes
ã®å¯äžã®åé¡ã¯ãåã·ã¹ãã ã«ãã£ãŠéä¿¡ãæ瀺ãããã°ããŒãã«ããã°ã©ã æ
å ±ãå¿
èŠã«ãªãããšã§ãã ããã«ãããåäžã¢ãžã¥ãŒã«ã®å€æã®ã·ããªãªãç ŽãããŸãïŒïŒ2499ãåç
§ïŒã ãã1ã€ã®ãªãã·ã§ã³ã¯ãã³ãŒã«ãµã€ãã«é
眮ããããšã§ãããããã«ãããäœæè
ã§ã¯ãªããã³ã¬ãŒã¿ãŠãŒã¶ãŒã«å€ãã®äœæ¥ãè¿œå ãããŸãã ããã§ãèšèšå³ã«æ»ãã代ããã«Reflect.metadataã¢ãããŒãã«çæããŸããã
以åã®ããŒãžã§ã³ã®ææ¡ãã芧ã«ãªã£ãå Žåãåãçç±ã§ã¢ã³ããšã³ã/ãã¶ã€ã³æã®ãã³ã¬ãŒã¿ãåé€ããå¿ èŠããããŸããã
æ確ã«ããŠããã ãããããšãããããŸãã ããã¯ãã¹ãŠçã«ããªã£ãŠããŸãã ãªãã¬ã¯ãããŒã¹ã®ã¢ãããŒãã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.metadataAPIã®ãµããŒããæºåããŸãã 説æããŠãããŠããããšãïŒ
ããã§ãããã®ããã«äœãæŸåºãããŸããïŒ
`` `language = javascript
@inject
ã¯ã©ã¹Foo {
ã³ã³ã¹ãã©ã¯ã¿ãŒïŒaïŒAãbïŒBïŒ{}
}
ã¯ã©ã¹ããŒ{
ã³ã³ã¹ãã©ã¯ã¿ãŒïŒaïŒæ°å€ãbïŒBïŒ{}
}
would it be (for Foo):
``` javascript
reflect.metadata('desing:paramtypes', [A, B])
@cmichaelgrahamã¯ããããã¯å€§ãŸãã«çæããããã®ã§ãã
ã¯ã¬ã€ãžãŒã¯ãŒã«!!!!
gulp -typescriptã䜿çšããŠãã®ãªããžããªãæ§ç¯ã
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ãã¬ãŒã ã¯ãŒã¯ãå€æŽããããšãªããä»æ¥ãããç°¡åã«æå¹ã«ããããšãã§ããŸãã Aureliaã®DIã©ã€ãã©ãªã«ã¯ããã¯container.addParameterInfoLocator
ãŸãã åãåãããã®äŸåé¢ä¿ãè¿ãããšãã§ããé¢æ°ãæž¡ããŸãã 次ã®ãªãªãŒã¹ïŒæ¥é±ïŒã§ã¯ããããã³ã¢æ§æã«è¿œå ã§ãããããTypeScriptéçºè
ã¯ç°¡åã«ãªã³ã«ã§ããŸãã ä»é±ã®ãªãªãŒã¹ã«å
¥ããŠããã ããããããããŸã å€æŽãããŠããããšã«æ°ã¥ããªãã£ãã
@EisenbergEffect brilliant !! ïŒ+1ïŒ
ã¢ãããŒã·ã§ã³ã䜿çšããŠããªããžã§ã¯ãã®ããããã£ãç£èŠå¯èœãšããŠããŒã¯ããŸãããããã«ãããããªããã£ããç£èŠå¯èœãªããžã§ã¯ãã«å€æãããŸãïŒèå³ã®ããæ¹ã¯ãhttpsïŒ//github.com/mweststrate/MOBservable/commit/8cc7fc0e20c000db660037c8b5c9d944fe4155d9ïŒã
ãã ããç¹ã«ããããã£ã®å Žåãã¢ãããŒã·ã§ã³ãã¯ã©ã¹èªäœã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãªããããã¿ã€ãã«é©çšãããã®ã¯å°ãäžèªç¶ã«æããŸãããããã¯ãåæå€ããŸãã¯this
ååŸããã®ãé£ããããšãæå³ããŸãthis
ãããã¯ã
ãã®äžãçŽ æŽãããæ©èœã§ãïŒ
ã¡ã¿ããŒã¿ãªãã¬ã¯ã·ã§ã³APIã䜿çšããŠãåçŽãªããããã£ã®äŸåæ§æ³šå
¥ãè¡ãããšãã§ããŸããã
å¿
èŠãªå€æŽã¯https://github.com/matjaz/property-DI/commit/2b4835e100b72d954b57d0e656ea524539ac17ebã§ç¢ºèªã§ã
æåã«åŒã³åºãããçæãããã³ãŒãã®__metadataãã³ã¬ãŒã¿ã§ããã¹ãã§ã¯ãããŸãããïŒ ã¯ã©ã¹ã®ã¡ã¿ããŒã¿ã䜿çšããŠåçŽãªããªã¯ã¬ãŒã¿ãŒãäœæãããã£ãã®ã§ãããæåŸã«__metadataïŒ 'designïŒparamtypes'ã[TYPES ....]ïŒãåŒã³åºããããããReflectãããããã®ããŒã¿ãååŸã§ããŸããã
@ufonããªããèŠãŠããã³ãŒããå ±æã§ããŸããïŒ
確ãã«ãããhttps://gist.github.com/ufon/5a2fa2481ac412117532
ç·šéïŒ
ç§ã®æªããç§ã®ã³ãŒãã«ä»ã®ããã€ãã®ééãããããã¯ã©ã¹ã®åæååŸã§ãåãååŸã§ããŸãã
@ufon ãåé¡ãçºçãããã©ããã¯ããããŸããã __metadataã¯ãã³ã¬ãŒã¿ãªã¹ãã®æåŸã®é ç®ã§ããããã¯ããããæåã«å®è¡ãããinjectãå®è¡ãããåã§ããããšãæå³ããŸãã
House = __decorate([
inject_1.inject,
__metadata('design:paramtypes', [Floor, String])
], House);
ããã§ã __decorate
å®çŸ©ã¯reduceæš©éã䜿çšããŠããã³ã¬ãŒã¿ãéã®é åºã§å®è¡ããŸãã
decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);
ããã¯ããã³ã¬ãŒã¿ïŒåŒãšããŠïŒã宣èšé ã«è©äŸ¡ãããããéã®é åºã§å®è¡ããããšããä»æ§ã«äžèŽããããã§ããããã«ãããå€éšãã³ã¬ãŒã¿ã¯å éšãã³ã¬ãŒã¿ããã®çµæãæ¶è²»ã§ããŸãã
ããããŸããããè¿·æããããããŠç³ãèš³ãããŸãã:)ç§ã®æªããç§ã®ã³ãŒãã«ä»ã®ããã€ãã®ééãããããã¯ã©ã¹ã®åæååŸã§ãåãååŸã§ããŸãã
ã©ã®ããã«ããããç §äŒããŠããŸããïŒ Reflect.metadataã®ããªãã£ã«ã¯ãããŸããïŒ
èŠæšã«è¿œå ...
Reflect.getMetadataKeysïŒHouseïŒ;
ããã«ããã空ã®é
åãçæãããŸãã
ã¯ãããreflect-metadataãããã±ãŒãžãå¿ èŠã§ã
ããªãã£ã«ãããã@ rbucktonã¯ããªããèŠãŠã¿ãããšãã§ããŸãã
ç§ã¯ãããæã«å
¥ãããšæããŸã...
requireã¯typescriptã®ãã«ããŒã³ãŒãã®åŸã«ââ移åãããŸã
var __metadata = this.__metadata || (typeof Reflect === "object" && Reflect.metadata) || function () { };
require('reflect-metadata');
ãã®ãããvar __metadataãåæåãããŠããéãpolyfillã¯ãŸã ããŒããããŠããŸãã
ããããçæãããã³ãŒãã®åã«ãããã®èŠä»¶ãååŸããããšã¯ã§ããŸãã
ç·šéïŒèŠç¹ãæŽæ°ããŸãã..åäžã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããããšãtypescriptã®çæãããã³ãŒãã¯åžžã«ãã¡ã€ã«ã®å é ã«ç§»åãããããã__ metadataã解決ãããåã«ããªãã£ã«ãããŒãããæ¹æ³ã¯ãããŸãã
ãã..ããã¯ãã£ãšå€§ããªåé¡ã§ãã ããã远跡ããããã«åé¡ïŒ2811ãèšé²ããŸãã
ãããŸã§ã¯ãå¥ã®ã¢ãžã¥ãŒã«ã§reflect-metadata
ãå¿
èŠã§ãïŒ2ã€ã®ãã¡ã€ã«ãå¿
èŠã§ãïŒã
https://github.com/matjaz/property-DI/ãåç
§ããŠ
åŒã³åºãã®äžæŽåããããããå¯å€/ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠãã³ã¬ãŒã¿ãŒãéçºããã®ã¯éåžžã«å°é£ã§ãã äŸãšããŠïŒ
<strong i="6">@F</strong>
prop: number;
@F()
prop: number;
åè ã®å ŽåãFã¯ãã©ã¡ãŒã¿ãŒïŒtargetãpropertyNameãpropertyDescriptorïŒã§åŒã³åºãããŸãããåŸè ã®å ŽåãFã¯ãã©ã¡ãŒã¿ãŒïŒïŒã§åŒã³åºãããå éšé¢æ°ãè¿ãããå¿ èŠããããŸããå éšé¢æ°ã¯ïŒtargetãpropertyNameã propertyDescriptorïŒã
ç§ã®_ä»®å®_ã¯ã @ 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()
åçã«ããããšã劚ãããŠãŒã¹ã±ãŒã¹ãããã€ããããŸãã ããã®ãã¡ã®1ã€ã ãã«ãå€éšãã¡ã¯ããªé¢æ°ã®åŒã³åºããå«ãŸããŠããŸããïŒ ããã¯ééããªãéåžžã«é©ãã¹ãåäœã§ãããAPIã³ã³ã·ã¥ãŒããŒã®èŠ³ç¹ãããã³ã¬ãŒã¿ãŒãåŒã³åºãæ¹æ³ã2ã€ããå¿
èŠãããçç±ãããããªããããããã§ã¯é©ãæå°ã®ååã«éåããŠããããã§ãã
JSã®èŠ³ç¹ããã¯éãããããŸããïŒ1ã€ã¯Fé¢æ°ã®åç
§ãæž¡ãããã1ã€ã¯é¢æ°ãå®è¡ããŠããããã®çµæã®åç
§ããã³ã¬ãŒã¿ãšããŠæž¡ããŸãïŒãç§ã¯éããŸãã @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()
äž¡æ¹ã®çœ²åãäœããã®åœ¢ã§ãã¡ã¯ããªçœ²åãšäžèŽããå¿
èŠããããããããã«ããåŒã³åºãã®æ··ä¹±ã®åé¡ã解決ãããŸãã ãã³ã¬ãŒã¿ãåŒã³åºãæ¹æ³ã¯1ã€ã ãã§ãã
次ã®å ŽåïŒ
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()
ãç°ãªããã®ã§ãããšæåŸ
ããã®ãšåãããã«ãæåã¯å€ãåç
§ãã2çªç®ã¯å€ãåŒã³åºããŸãã @F
ã¯ãã³ã¬ãŒã¿ãé©çšãã @F()
ã¯ãã³ã¬ãŒã¿ãäœæããé¢æ°ãåŒã³åºããŸãã ãããã¯åãæäœã§ã¯ãªããåãæäœã§ãã£ãŠã¯ãªããŸããã
@DavidSoutherãããåœãŠã¯ãŸããªãããŸãã¯åœãŠã¯ãŸããªãæ£åœãªçç±ã¯ãããŸããïŒ @F
ãš@F()
åŒã³åºãã«ã¯æ©èœçãªéãã¯ãããŸãããããããã®å®çŸ©æ¹æ³ãšææžåæ¹æ³ã«ã¯ããªã倧ããªéãããããåŒã³åºããããã«è€éã«ãªããäžèŠã«ãªãã¯ãã§ãã
ç§ã®ææ¡ã¯ããã³ã¬ãŒã¿ãå®çŸ©ããå¿ èŠããªãããã2ã€ã®æ¹æ³ããã£ãŠã¯ãªããããã³ã¬ãŒã¿ãè€æ°ã®æ¹æ³ã§å®çŸ©ããå¿ èŠããªããšããããšã§ãã
@Fãš@FïŒïŒã®åŒã³åºãã®éã«æ©èœçãªéãã¯ãããŸãã
ãããè«äºã®èŠç¹ã ãšæããŸãã ç§ã¯ãããçå®ã ãšã¯æããŸããã Fã¯é¢æ°ãžã®åç
§ã§ãããFïŒïŒã¯ç©ºã®åŒæ°ã»ããïŒã€ãŸãF.call(this, [])
ïŒã§åŒã³åºããããšãã®Fã®æ»ãå€ãžã®åç
§ã§ãã ãããã¯æ©èœçã«ãæŠå¿µçã«ãç°ãªã2ã€ã®ãã®ã§ãã
@Tharaxis @F
ãš@F()
ã¯å¥ç©ã§ãã ãããã®äœ¿çšæ¹æ³ãææžåã®æ¹æ³ãããã³çµ¶å¯Ÿã«å¿
èŠãªåŒã³åºãã®éãããããŸãã
å¥ã®æ¹æ³ã§è³ªåãããŠãã ããããªããã¹ãŠã®ãã³ã¬ãŒã¿é¢æ°ããã¡ã¯ããªã«ããå¿ èŠãããã®ã§ããããã ããªãã®ææ¡ã䜿çšãããšãåçŽãªãã³ã¬ãŒã¿ãæã€ããšã¯äžå¯èœã§ãã
@mhegazyã¯ãåŸè
ã®ãªãã·ã§ã³ïŒ @F()
ïŒããåé¢ãããïŒããã³è€è£œãããïŒãã³ã¬ãŒã¿é¢æ°ã®äœæãš@F
åŒã³åºããéããŠãæ©èœã¯ããŒãžã£ãšè¿œå ã®ãªãŒããŒãããã®çæãããããããšãèªããŸããåºæ¬çã«ãå
±æãã³ã¬ãŒã¿é¢æ°åç
§ã«å¯ŸããŠå®è¡ãããŸããã¯ããŒãžã£ã«ããåé¢ã¯ãããå®å
šãã§äžè²«æ§ããããé©ãã®å¯èœæ§ãäœããªããŸãã
@DavidSoutherããªãã®è³ªåã¯ãåçŽãªãã³ã¬ãŒã¿ãšããŠäœãå®çŸ©ãããã«ãã£ãŠç°ãªããŸãã 次ã®åœ¢åŒã®åçŽãªãã³ã¬ãŒã¿ãæã€ããšã劚ãããã®ã¯ãããŸããã
declare function F(): PropertyDecorator {
return (target, name) => {
// do stuff
}
}
ããã¯ãåçŽãªæ§æããããããã2è¡å€ãã䜿çšå¯èœãªãã³ã¬ãŒã¿åŒã³åºããäœã§ããããããæ確ã«å®çŸ©ããŠãããããããã¯éåžžã«äœäŸµè¥²ã§ããããšãããããŸãã ããã«ããã³ã¬ãŒã¿ãå®çŸ©ããæ¹æ³ã¯1ã€ãããªãããïŒäžè²«æ§ã®å€ã軜èŠããªãã§ãã ããïŒããåçŽãªæ§æããšæ¯èŒããŠããããäœæããã®ã«ããããããã«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;
ãããã®ãã¡ã®1ã€ã¯ä»ãšã¯ç°ãªããŸãã @F
ã®äœ¿çšã¯ãé¡é¢ã©ããã«æ©èœããã¯ãã§ãããæ©èœããŸããã ç§ãFã®åºç€ãšãªã宣èšãã©ã®ããã«èŠããããç¥ããªããã代ããã«Fãååšãããªãã·ã§ã³ã®åŒæ°ã®ã»ãããåãããšãã§ããããšãç¥ã£ãŠãã人ã®ãµããããããšãèŠããŠãããŠãã ããã ç§ã@F
ééããå¯èœæ§ã¯ãçŸåšã®ã¡ã«ããºã ã§ã¯ç°¡åã§ã¯ãããŸããã ããã¯ãéçºè
/ããã¥ã¡ã³ããŒã·ã§ã³ã«å€§ããªè²¬ä»»ãè² ãããæ¶è²»è
ã@F
ãæ©èœããªãããšãèªèããŠããããšã確èªããŸãïŒãã ãã @C
ã¯äœããã®åœ¢ã§ãç°ãªãããããæ©èœããå¯èœæ§ããããŸãïŒã
æ¶è²»è ãå¿é ããå¿ èŠã®ãªãã1ã€ã®ãµã€ãºã§ãã¹ãŠã«å¯Ÿå¿ããããã³ã¬ãŒã¿ãå¿ èŠãªå Žåã¯ã次ã®ãããªæãããããšãè¡ãå¿ èŠããããŸãã
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ã«ãã£ãŠèšåããããã³ã¬ãŒã¿ã®ããã»ã©ç²ŸéããŠããªããŠãŒã¶ãŒã®1人ã§ã...
ç§ãæã£ãŠãã質åã¯ããã³ã¬ãŒã¿ãé¢æ°ãšäžèŽããŠããå¿ èŠããããã©ããã ãšæããŸãã ã€ãŸããé¢æ°ã®å Žåãthis.fãšthis.fïŒïŒãè¿ãããšã¯ãå€ãå¿ èŠãªå Žåãããã°ãå€ãçæãããã®ãå¿ èŠãªå Žåããããããå®å šã«çã«ããªã£ãŠããŸãã
ãã³ã¬ãŒã¿ã®å Žåãèšèªæ©èœã¬ãã«ã§ã¯ããã»ã©æ確ã§ã¯ãªãããã§ãã ãã³ã¬ãŒã¿@Fãé©çšãããã ãã§ããã¡ã¯ããªã¡ãœãããšããŠå®è£ ãããŠããã®ãéçã¡ãœãããšããŠå®è£ ãããŠããã®ããç¥ããããããŸããã ããã¯ããã³ã¬ãŒã¿ãæã£ãŠããæ©èœã倱ãå Žåãé€ããŠã§ãã
äžèšã誀ã£ãæ å ±ãç¡ç¥ã§ããå Žåã¯ãç³ãèš³ãããŸããããç§ã¯JavaScriptã®äžçã§ã¯æ¯èŒçæ°ããã§ãã
ããããšãïŒä¹Ÿæ¯
ãŸãããã®è³ªåãããå¿ èŠããããŸã-ãé¢æ°ã䜿çšããŠå®çŸ©ãããŠããããã以å€ã«ããããæ¬åœã®çç±ããªãå Žåã«ã®ã¿ãé¢æ°_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()
ã®éãã¯ãæ¶è²»è
ã®èªç¥çè² æ
ã倧ããå¯èœæ§ãããããšãç解ããŠããŸãã ãã ããçºè¡ãããã³ãŒããã€ãŸãåäœãå€æŽããŠã2ã€ãåçã«åäœããããã«èŠæ±ããŠããããã§ãã 2ã€ã®åœ¢åŒãåãããã«æ±ãããå¯èœæ§ã¯éåžžã«äœããããããã¯ãã³ã¬ãŒã¿ã«é¢ããES7ã®ææ¡ãšççŸããå¯èœæ§ããããŸãã ãããçºæ£ã«ã€ãªããã®ã¯è¯ããªãã§ãããã
ãã1ã€ã®ãã€ã³ãã¯ãããã§ã®æ··ä¹±ã¯ãé¢æ°ãã³ãŒã«ããã¯ãšããŠæž¡ãããšãšé¢æ°ãåŒã³åºãããšã®éã®æ··ä¹±ã«äŒŒãŠãããšããããšã§ãã ããªãããããæã£ãŠãããªã
function callbackFactory() {
return function(...args: any[]) { // do stuff };
}
function takesCallback(cb: (...args: any[]) => void) { }
takesCallback(callbackFactory());
ãŠãŒã¶ãŒã¯æ··ä¹±ããŠåŒã³åºãããšããããŸãtakesCallback(callbackFactory)
èµ·åããã«callbackFactory
ã ããã¯ããã³ã¬ãŒã¿ã§ææããæ··ä¹±ãšãŸã£ããåãã§ãããèšèªãããã2ã€ã®åœ¢åŒãæ£èŠåããŠåãããšãè¡ããšãè¡šçŸåºŠãäœäžããŸãã åºå¥ãéèŠãªå Žåããããç¶æããå¿
èŠããããŸãã ããããã³ã¬ãŒã¿ã«ãäžè¬çã«åœãŠã¯ãŸããã©ããã¯ããããŸããããçè«çã«ã¯ç¢ºãã«åœãŠã¯ãŸããŸãã
@JsonFreemanç§ã¯ããªãã®è°è«ãæ¬åœã«
é¢æ°ã«é¢ããããªãã®äŸãšããŠã¯ãå®éã«ã¯å®å šã«ç°ãªãæ§é ã§ããïŒãããŠããããã¹ãã§ããïŒãšãã«ãé¢æ°ããã³ã¬ãŒã¿ãšæ··åããŠããããã«èŠããŸãã JavaScriptã§é¢æ°ãæäœããŠãããšããé¢æ°ãã©ã®ããã«äœ¿çšãããŠããããç解ããé¢æ°åç §ãšé¢æ°åŒã³åºãã®éããç解ããŠããŸãïŒãããŠãã©ã¡ããäžæ¹ã䜿çšãããå ŽåïŒ-ãããŠäœãã説æãããšãæ©èœãšããŠããããã©ã®ãããªäœ¿çšæ³ãæã£ãŠãããã«ã€ããŠæ··ä¹±ã¯ãããŸããã ãã³ã¬ãŒã¿ã¯é¢æ°ã§ã¯ãªããé¢æ°ã®åäœãç¶æ¿ããã¹ãã§ã¯ãããŸããã é¢æ°ã¯ããã³ã¬ãŒã¿ãæ§ç¯ããããã®æ¹æ³ã«ãããŸããã ããã¯ãã¯ã©ã¹ãé¢æ°ã§ãããšèšã£ãŠãããããªãã®ã§ãããããã§ã¯ãããŸãããé¢æ°ã¯ãES6ããåã®ã¯ã©ã¹ã説æããæ¹æ³ã«ãããŸããããã以äžãæçœãªã¡ãœãããå©çšã§ããªãã£ãããã§ãã ã¯ã©ã¹ã¯é¢æ°ã®ããããã£ãåŒãåããŸãããé¢æ°ã®ãããªã¯ã©ã¹ãåŒã³åºãããšã¯ã§ããŸããããES6ããåã®é¢æ°ã䜿çšããŠã¯ã©ã¹ã宣èšããŸãã
ãšã«ãããç§ã¯ãã®åé¡ã«ã€ããŠã®ç§ã®è°è«ã®ãã€ã³ãã䜿ãæããããšæããŠããŸãã éžæãåé¿ããå¿ èŠããããŸãã ç§èªèº«ã®ã³ãŒãã§ã¯ãäžè²«æ§ãä¿ã€ããã«åžžã«ãã¡ã¯ããªã䜿çšããŸãã ãã³ã¬ãŒã¿ãæåéãé¢æ°ãšããŠæ±ãããšã¯ãå°æ¥çã«å€ãã®ãã©ã¹ãã¬ãŒã·ã§ã³ãåŒãèµ·ããå¯èœæ§ããããšç§ã¯ä»ã§ãä¿¡ããŠããŸãããããã¯ç§ã ãã§ãã
@mhegazyããã¯ã @ jonathandturnerãã³ã¬ãŒã¿ãªããžããªã§åãäžããã®ãšåãåé¡ã§ãïŒ https ïŒ
@Tharaxis ãç§ã¯ããªãã®æåã®ç¹ã«åæããŸãã ES7ã®ææ¡ãç§ãã¡ãäœããããŸãèšèšããããšã劚ããã¹ãã§ã¯ãªããšç§ã¯æããŸãããããŠç§ãã¡ã®èšèšã¯ç¢ºãã«ES7ã®åå ã®1ã€ã§ãã
ããã³ã¬ãŒã¿ã¯é¢æ°ã®åŒæ°ã§ã¯ãªããã«ã€ããŠã¯ãç§ã誀解ããªãéãããã³ã¬ãŒã¿èªäœã«ã€ããŠã¯èª¬æããŠããŸããããã³ã¬ãŒã¿ãã¡ã¯ããªã«ã€ããŠèª¬æããŠããŸãã ãããŠããã³ã¬ãŒã¿ãšé¢æ°ã®éãã«é¢ä¿ãªãããã³ã¬ãŒã¿_factories_ã¯å®éã«ã¯åãªãé¢æ°ã ãšæããŸãã ãããŠãéåžžã®é¢æ°ã§ãããã³ã¬ãŒã¿ãã¡ã¯ããªãžã®åŒã³åºããèªåçã«çæããããã³ã³ãã€ã©ã«èŠæ±ããŠããããã§ãã ãããèµ·ãã£ãå Žåãããã°ã©ããŒããã³ã¬ãŒã¿ãŒãã¡ã¯ããªãŒãšãã³ã¬ãŒã¿ãŒãåºå¥ããæ¹æ³ã¯ãããŸããã
ãŸãããã³ã¬ãŒã¿ãé¢æ°ãšããŠæ±ãããšã®è¯ãç¹ã¯ãæ¶è²»è ããã³ã¬ãŒã¿ãšããŠããŸãã¯åã«é©åãšæãããããã«åŒã³åºãããšã§ããã³ã¬ãŒã¿ãé©çšã§ããããšã§ãã
@JsonFreemanåŒæ°ã¯ããã³ã¬ãŒã¿ã®èšè¿°ãšåŒã³åºãã®äž¡æ¹ãè¡ã2ã€ã®æ¹æ³ãããçŸåšã®ç¶æ³ãäžå¿ã«å±éããŸãã1ã€ã¯ãã¡ã¯ããªé¢æ°ã䜿çšãããã1ã€ã¯ãrawãé¢æ°ãšããŠïŒãã¡ã¯ããªã®å Žåã¯ãã¡ã¯ããªåŒã³åºãã®çµæã§ãïŒã ïŒããããŠè³ªåã¯ããã äžã€ã®æ¹æ³ãããã¹ãã§ã¯ãªããå·¥å Žããã®ããã«ããã¹ãã§ããããšããããšã§ããã
ç§ãæ±ããŠããã®ã¯ãã¯ãã§ããã³ã³ãã€ã©ã«@F
ã@F()
åŒã³åºããšåçã®ãã®ã«å€æãããåãã§ãã¯ã«0 ... nãã©ã¡ãŒã¿ã®åŒæ°ãªã¹ããèŠæ±ãããããšã¯ã§ããŸãããæ¬åŒ§ãªãã®æ§æã ãããããã...ããã°ã©ãããã³ã¬ãŒã¿ãã¡ã¯ããªãšãã³ã¬ãŒã¿ãåºå¥ããæ¹æ³ã¯ãªãã§ããã...ãã®æå³ã詳ãã説æããããšãã§ããŸããåºå¥ããã®ã¯éåžžã«ç°¡åã ãšæãããã§ãã ãã³ã¬ãŒã¿ã¯åžžã«ãã¡ã¯ããªããã®å¿çã§ããããã¡ã¯ããªã®ååã¯ãã³ã¬ãŒã¿ã®ååã§ã...ããã»ã©é£ããããšã§ã¯ãããŸãããããããšãç§ã¯èª€è§£ããŠããŸããïŒ
æ¶è²»è
ããã³ã¬ãŒã¿ãé©çšã§ããããã«ããããšã«ã€ããŠã®æåŸã®ãã€ã³ãã«ã€ããŠã¯ããã¹ãŠã®ãã³ã¬ãŒã¿ããã¡ã¯ããªã䜿çšããããšãååã«èª¬æãããŠããå Žåãèªåã§ãã³ã¬ãŒã¿ãåŒã³åºãã®ã¯éåžžã«ç°¡åã§ãã <decorator name>(target, name)
ãšæ¯èŒããŠ<decorator name>(<argument list>)(target, name)
å®è¡ããã ãã§ããäŸãšããŠ<decorator name>(target, name)
ã å·¥å Žã®äœ¿çšã矩åä»ããããšã¯åè
ã®äŸãåžžã«æ©èœããããšãæå³ããŸããã矩åä»ããªãå Žåã¯åŸè
ã®äŸãæ©èœããªãå Žåãããããã³ã¬ãŒã¿ã®å®è£
æ¹æ³ã«å®å
šã«äŸåããããšã«æ³šæããŠãã ãã-é çãèµ·ããã®ãåŸ
ã£ãŠããŸãã
ææããå¿ èŠããããšæããŸããé¢æ°ã䜿çšãããã³ã¬ãŒã¿ã«åé¡ã¯ãããŸããããåãããšã2ã€ã®æ¹æ³ã§èšè¿°ãããšãäžè²«æ§ã®åé¡ãçºçãããšããåé¡ããããŸãã ç¹ã«ãããã2ã€ã®æ¹æ³ããåŒã³åºãæ¹æ³ãç°ãªãå¿ èŠãããããšãæå³ããå Žåã¯ç¹ã«ããã§ãã ããã¯ããªãã¡ã¯ã¿ãªã³ã°ããèšèªã®äžè²«æ§ãŸã§ãã¹ãŠã劚ããæ Œå·®ã§ãã
ããã€ãã®æçš¿ã§èª¬æãããªãã¡ã¯ã¿ãªã³ã°ã®åé¡ã¯ãçŸåšã®æ¹æ³ãæ€æ»ããå¿ èŠãããçç±ãšããŠã¯ååãããã¯ãã§ãã
ã¿ãªãããããã«ã¡ã¯ã
次ã®å Žåã¯ãçŸåšã®ææ¡ã«æºè¶³ããŠããŸãã
aïŒå®å®ã¯ããã矩åä»ããŠããŸãã
bïŒç¶æ³ãç°ãªããšããã³ã¬ãŒã¿ã¯éèŠãªæ©èœã倱ããŸãã
åŸè ã¯ãã¡ãã䟡å€å€æã§ããããã®çãã¯ããªããéçºè ã®ã¿ã€ãïŒã€ãŸãäžè¬ãŠãŒã¶ãŒ/ãšãã¹ããŒããŠãŒã¶ãŒãªã©ïŒã«ããçšåºŠäŸåããŸãã ç§ã¯åè ã®ã«ããŽãªãŒã«å±ããŠãããéåžžãè€æ°ã®èšèªãšãã¬ãŒã ã¯ãŒã¯ã«èãåæ£ããŠããŸãã ãããã£ãŠãç§ã«ãšã£ãŠãéèŠãªæ©èœãã«ã¯ããã³ã¬ãŒã¿ã2ã€ã®ç°ãªãæ¹æ³ã§èšè¿°ã§ããæè»æ§ã¯å«ãŸããŸããã ãã¹ãŠã®ãã¬ãŒããªãã®äŸã¯ãããããååšããå Žåã¯çŽ æŽãããã§ãããã
çæ³çã«ã¯ã @ Fãš@FïŒïŒããã³ã¬ââãŒã¿ã®å®è£ æ¹æ³ã«é¢ä¿ãªãäžè²«ããŠããã°çŽ æŽãããã®ã§ãããããã§ãªãå Žåã¯ãèã®äžã®ããããé¿ãããããããã³ã¬ãŒã¿ãäœæãããšãã«ãã¡ã¯ããªã䜿çšããããã«å¶éãããããšæããŸããç§ããããã䜿çšããŠãããšãã¯ãã€ã§ãã
ããããšãïŒä¹Ÿæ¯
ãã®ãªã¯ãšã¹ãã¯ããã³ã¬ãŒã¿ãã¡ã¯ããªããã³ã¬ãŒã¿ã䜿çšããããã®æšæºçãªæ¹æ³ã§ãããšããèãã«åºã¥ããŠããããã§ãããããã«ãã£ãŠãŠãŒã¶ãŒãçã®ãã³ã¬ãŒã¿ãå®çŸ©ããŠäœ¿çšããæ¹æ³ãããããŸããã ãã³ã¬ãŒã¿F
ãå®çŸ©ããã¢ããªã±ãŒã·ã§ã³@F
ã@F()
ãšããŠæ±ãããå ŽåãFèªäœã§ã¯ãªããFãåŒã³åºããçµæããã³ã¬ãŒã¿ãšããŠäœ¿çšãããŸãã 誰ãããã³ã¬ãŒã¿ãã¡ã¯ããªã®ä»£ããã«çã®ãã³ã¬ãŒã¿ãé©çšããããšãããšãã©ããã§ãšã©ãŒãçºçããããšã瀺åããŠããŸããïŒ
ãã®ã¢ã€ãã¢ã¯ããã³ã¬ãŒã¿ãšãã³ã¬ãŒã¿ãã¡ã¯ããªã®èªç¶ãªæ§ææ§ãé転ãããããã«æããŸãã ãã³ã¬ãŒã¿ã¯ééããªãããã®åå§çãªæ§æã®ããã«æããŸãããã³ã¬ãŒã¿ãã¡ã¯ããªã¯ãã³ã¬ãŒã¿ã®äžã«æ§ç¯ãããæœè±¡åã¬ã€ã€ãŒã§ãã ãããã¯åãªããã¿ãŒã³ã§ããããã以äžã®ãã®ã§ã¯ãããŸããã 代ããã«ããã³ã¬ãŒã¿ãã¡ã¯ããªãæšæºçãªãã®ãã€ãŸãããªããã£ãã«ãªã£ãå Žåã人ã ã¯ãåŒæ°ããšããã«ãã©ãããªãã³ã¬ãŒã¿ãè¿ããã³ã¬ãŒã¿ãã¡ã¯ããªã®æãå®çŸ©ããŸãã ããã¯éåžžã«ã°ãããŠãããšæãå§ããåºæ¬çãšèŠãªããããã®ãšããè€éãšèŠãªããããã®ã®èªç¶ãªçŽæãé転ãããŸãã
ãã³ã¬ãŒã¿ã«é¢ããŠç§ãéåžžã«èŠæããŠããããšã®1ã€ã¯ãéå°ãªéæ³ã§ãã ã³ãŒããäœãããŠããã®ãããããªããšãã¯å人çã«ç·åŒµããŸããã³ã³ãã€ã©ãŒãããã°ã©ããŒãæžããªãã£ãåŒã³åºããå¯ãã«è¿œå ããŠãããšãããã¯ããŸãã«ãããŒãã¥ãŒã®ããã«æããŸãã
ããã«ã¡ã¯@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ãŒããã©ã¡ãŒã¿é¢æ°ã䜿çšããããšãã代ããã«å€æ°ã®ïŒã¿ãŒã²ãããååïŒé¢æ°ã䜿çšãããããå¿ ãããéããã®ã§ãããã©ããã¯
ãã1ã€ã®ãªãã·ã§ã³ã¯ã @F
ãšåŒã°ãããã³ã¬ãŒã¿ããClassDecoratorãMethodDecoratorãPropertyDecoratorãParameterDecoratorã®ãã¿ãŒã³ããŸãã¯ClassDecoratorãMethodDecoratorãPropertyDecoratorãè¿ã0..nargãã¡ã¯ããªé¢æ°ã®ããããã«äžèŽã§ããããã«ããããšã§ãããŸãã¯ParameterDecoratorã ãã ãããã®å®è£
ã¯ä»ã®ãšã©ãŒãåŒãèµ·ããïŒ2ã€ã®ç«¶åããé¢æ°ãããå Žåãã©ã¡ããæãäžèŽãããšèŠãªãããŸããïŒïŒãã³ã³ãã€ã©ãŒå
ã«é床ã®è€éããè¿œå ããã ãã ãšæããŸãã @F
åŒã³åºãã@F()
å€æããã ãã§ãããç°¡åãªè§£æ±ºçã«ãªããåè¿°ã®ããŸããŸãªåé¡ã解決ã§ããŸãã
ç³ãèš³ãããŸããããæ確ã«ããããã«ãç§ã¯ããªãã®è§£æ±ºçãè€éã§ãããšã¯äž»åŒµããŠããŸããã§ããã ãã³ã¬ãŒã¿ãé©çšããåã«èªåçã«åŒã³åºãããšã¯äžéæã§ããããšãæå³ããŸããã æ¿å ¥ãããåŒã³åºãã¯ãŠãŒã¶ãŒã«ã¯èŠãããå€ãã®ãŠãŒã¶ãŒããããæåŸ ããŠããªãããã«æããŸãã
çŸåšã®ç¶æ³ãè€éã§ã¯ãªããšæããŸãã ãææã®ãšãããã©ã€ãã©ãªã®äœæè ã¯ããã®æ©èœããã³ã¬ãŒã¿ãšããŠé©çšãããããšãæå³ããŠãããã©ããã«ã€ããŠãæŒ ç¶ãšããŠããããæå°æªãªæ 床ããšãããšãã§ããŸãã ç§ãããªãã«äžããããšã ããããåªããã©ã€ãã©ãªã¯ãããæããã«ããŸãã
ææ¡ããã¹ããŒã ã§ã¯ãåŒã³åºããèªåçã«è¡ãå Žåãèå¥åã ãã§ãªãä»»æã®ãã³ã¬ãŒã¿åŒã䜿çšãããšã©ããªããŸããïŒ ãããåŒã³åºãããŸããïŒ
ç¹ã«ææžåãããŠããªãéããæé»ã®åŒã³åºãã¯é©ãã¹ããã®ã«ãªãå¯èœæ§ããããŸãããCïŒå±æ§ãªã©ã®æŠå¿µã䜿çšããŠããªã人ã«ã®ã¿åæããŸãã
ä»»æã®ãã³ã¬ãŒã¿åŒã®æå³ã«ã€ããŠè©³ããæããŠãã ããã
è¯ãèæ±ããã³ã¬ãŒã¿ã®å®çŸ©ã«åœ¹ç«ã€ãã³ã¬ãŒã¿ãTypeceptionã®æ·±å»ãªã±ãŒã¹ã
ãã§ã¢ã³ãŒã«ã é±æ«ã®ååŸé ãã«ãããèããããŠããªãã³ã¡ã³ããããã®ã«ãŽã£ããã§ãã åŠãã æèšã Internet.undoïŒïŒã
ç§ã®ãã€ã³ãã¯ãäžè²«ããåŒã³åºããµã€ãã®æ§æã§ãã¡ã¯ããªã®äœ¿çšã矩åä»ããããŠããããšãå€æããå Žåãç§ã¯ããã«æºè¶³ããŠãããšããããšã§ãã ãã€ã©ãŒãã¬ãŒããåãå€ãããã®ãã³ã¬ãŒã¿ãäœæããããšã¯ééããããŸããã ç¹°ãè¿ããŸããããã³ã¬ãŒã¿ã䜿çšããå Žåã®ç¹°ãè¿ãã®çã¿ãããããã³ã¬ãŒã¿ãäœæãããšãã®å°ãã®çã¿ã®æ¹ã奜ãã§ãïŒçŸæç¹ã§ã¯æœåšçãªçã¿ããããŸããïŒã ä»ã®äººã¯åæããŸããã
APIã®æ©èœåŒ·åã«ãåé¡ã¯ãããŸãããïŒ ãã¡ã¯ããªãªãã§äœæããããã³ã¬ãŒã¿ã«ã¯ãåŸã§ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãè¿œå ããããšã¯ã§ããªããããå°æ¥çã«ã¯@F
ãš@F2()
ãäºæž¬ããŸãã
ãŸãã f
ãšf()
ã䜿çšãããšããã®ã·ããªãªãçºçããããšã¯ããããŸããããããã¯ãæ¶è²»åŽã§ç°ãªããŠãŒã¹ã±ãŒã¹ã§ãã ãã³ã¬ãŒã¿ã®å Žåãç§ã¯åžžã«ã¿ãŒã²ããã«ãã³ã¬ãŒã¿ããã®å Žã§é©çš/åŒã³åºããŠãããããã¯ã°ã©ãŠã³ãã§ã¡ãœããã®åŒã³åºããåžžã«è¡ãããŠããŸãã
ããããç§ã«ãšã£ãŠããã®æ žå¿ã¯äœ¿ããããã®åé¡ã§ãããã³ã¬ãŒã¿ãé©çšãããšããèè ããããã©ã®ããã«å®è£ ãããã調ã¹ãããã«ã°ãŒã°ã«ã§æ€çŽ¢ããå¿ èŠã¯ãããŸãããããã±ãŒãžã§ã¯ãªããåäœã«é¢å¿ããããŸãã
也æ¯
èŠçŽããæåŸã®ã¡ã¢ã§ããããããç§ã¯éãã«ããŠãããŸãã èŠããã«ãããã¯ç§ã«ãšã£ãŠæ¬åœã«åãªãã€ã³ã¿ã©ã¯ã·ã§ã³ãã¶ã€ã³ã®åé¡ã§ãã ç§ã¯ãã³ã¬ãŒã¿ãå€åŽãããã¶ã€ã³ãããŠããã®ãèŠãããšæã£ãŠããŸãããã®éã§ã¯ãããŸããã
UI / UXã®äººãšããŠãç§ã¯ãããããªãé »ç¹ã«èŠãŸãã ç§ã¯ããŠãŒã¶ãŒãå·ã€ããUIãœãªã¥ãŒã·ã§ã³ãææ¡ããæèœã®ããéçºè ãšååããŠããŸããïŒ1ã€ã®äŸã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®è€éãã解決ããããã®2ã€ã®ä¿åãã¿ã³ã§ãã-ãããè³¢ããŠåªç§ãªäººéã§ãïŒã è€éãªå®è£ ã®è©³çŽ°ããžãã¯ã«ã²ããŸãããšãç¥ã£ãŠããããšãå¿ããŠãå¹³åçãªãŠãŒã¶ãŒã®ç®ãéããŠèŠãã®ã¯é£ãããšæããŸãã
ããŠãå¹³åãšããŠç§ããŸã£ããééã£ãŠããå ŽåããŸãã¯è€éããçŸåšã®èšèšã矩åä»ããŠããå Žåããã¹ãŠãè¯ãå Žåãç§ã¯é ãæ©ãŸããŠåŠã¶å¿ èŠããããŸãã
也æ¯
ãã³ã¬ãŒã¿ãèå¥åã§ã¯ãªããä»ã®åŒã§ããå Žåãèªåçã«åŒã³åºããŸããïŒããšãã°ããã³ã¬ãŒã¿ã§ãããšããŸãããã ãã©ãŒã«ããã¯é¢æ°åŒãš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;
}
ãããã¯ã¹ã³ãŒãã®é åºã«åŸãã®ã§ããã¹ãŠã®ããããã£/ã¡ãœãããæåã«å®£èšã®é åºã§ã次ã«ã¯ã©ã¹ã®é åºã«ãªããŸãã ããªãã¡ã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
ã¯ããã§ã¯æå¹ãªè°è«ã§ã¯ãããŸãããç§èŠã ãŸããJavaScriptã®ãã³ã¬ãŒã¿ã¯ã¯ã©ã¹/ãã£ãŒã«ãã¿ã€ããå€æŽã§ãããããTSãšJSã®éã«äºææ§ã®åé¡ã¯ãããŸããã 次ã«ããã³ã¬ãŒã¿ã¯éçã«é©çšãããŸããTSã³ã³ãã€ã©ã¯ãå®çŸ©ãµã€ãã§å
ã®ãã£ãŒã«ãã¿ã€ããšè£
食ããããã£ãŒã«ãã¿ã€ãã«ã€ããŠæšè«ã§ããŸãã
@HerringtonDarkholmeããã¯å¥ã®ææ¡ã§è¿œè·¡ããå¿ èŠããããšæããŸãã äž»ãªçç±ã¯ãã³ã³ãã€ã©ãåã«ã€ããŠæšè«ããæ¹æ³ã宣èšã«ãããã®ã§ãããšããããšã§ãã åã宣èšããããšããããå€æŽããããšã¯ã§ããŸããã ããã¯ã¹ã«ã¿ã€ããã¥ãŒããŒã¿ãŒãè¿œå ãããšããããšã¯ãæ¯ãããããã«ãªãå¯èœæ§ã®ãã宣èšã解決ããŠããã®ã§ããããã解決ããå¿ èŠãããããšãæå³ããŸãã
@mhegazyã§ã¯ããããæå³çãªèšèšã§ã¯ãªããå®è£ ã容æã«ããããã®åŠ¥åæ¡ãšããŠç解ã§ããŸããïŒ
ãã®ææ¡ã«ãããšããã³ã¬ãŒã¿ã¯ã宣èšåæ§æãç¶æããªãããèšèšæã«ã³ãŒããå®è¡ããæ©èœã埩å
ããŸãã ãããã£ãŠã次ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
å°æ¥ã®JavaScriptã§ã¯æå¹ã§ãããä»æ¥ã®TypeScriptã§ã¯ç¡å¹ã§ãïŒãã ããããã¯ãã€ãTSã§åãå
¥ããããå¯èœæ§ããããŸãããïŒïŒã
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
ã¿ã€ãã³ã°ã®ãããªäŒŒããããªè©±ã§ã¯ãªãããšã確èªããããšæããŸãã
çŸåšã®ãã§ãã¯ã§ã¯ãã¿ãŒã²ããã«å²ãåœãŠå¯èœãªãã³ã¬ãŒã¿ããäœããè¿ãå¿ èŠããããŸãã æ¬ èœããŠããéšåã¯ãã¿ã€ããžã®è¿œå ããã£ããã£ããŠããªãããšã§ãã ã©ãããã°ããã®ãããããªããšæããŸãããããŸãèããŠããŸããã ã§ããããããã¯å ¬æ£ãªææ¡ã ãšæããŸããããããå®è£ ããããã®ã³ã¹ãã¯éåžžã«é«ããããããŸããã
çæ³çã«ã¯ããã³ã¬ãŒã¿ã«ãã£ãŠè¿ãããã¿ã€ãã¯ã¿ãŒã²ãããšåãã§ããå¿ èŠããããšæããŸãã å²ãåœãŠã®ãœãŒã¹äœçœ®ãšã¿ãŒã²ããäœçœ®ã®ã©ã¡ãã§è£ 食ã¿ã€ãã䜿çšãããã¯ããããŸããã
ãã³ã¬ãŒã¿ã®ãªã¿ãŒã³ã¿ã€ããšã¿ãŒã²ãããããŒãžããå¿ èŠããããšæããŸãããããã¯ã¹ã€ã³ã®ãããªãã®ã§ãã
ããã€ãã®è¿œå æ©èœã®ã¢ã€ãã¢ã 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
ä»ããŠé©çšãããããšãææ¡ããŸãã ããã«ãããã¡ãœãããšåãããã«ã1ã€ã®ããããã£ã§è€æ°ã®ãã³ã¬ãŒã¿ã䜿çšããããšãã§ããŸãã
ä»ã®ãšããïŒ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ããããšãïŒ ããªããã¡ã¯åãã»ãã³ãã£ã¯ã¹ã«åæããããã«ããã«ãšè©±ãåã£ãŠããŸããïŒ ãããäžçªå€§äºã ãšæããŸãã
ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã®å€ãæå®ããããã«ãã³ã¬ãŒã¿ã䜿çšãããšäŸ¿å©ãªã®ã¯ãªãã§ããïŒ ãããããããã£åæååã®ç®çã§ã¯ãããŸãããïŒ
ç§ã®ãŠãŒã¹ã±ãŒã¹ã¯ãäŸãããè€éã§ãã ç§ã¯å®éã«ãã³ã¬ãŒã¿ã䜿çšããŠãããããã£ã®this
ã³ã³ããã¹ãã«ãã€ã³ãããããªããžã§ã¯ããè¿ãã²ãã¿ãŒãå®çŸ©ããŠããã®ã§ããã®ãªããžã§ã¯ãã®ã¡ãœããã¯ããããå®çŸ©ãããã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
ããã¯ãPythonã§èšè¿°åãããã³ã«ããšãã¥ã¬ãŒãããfoo
ïŒã€ãŸãfoo.bar
ïŒãä»ããŠã¯ã©ã¹Foo
å®çŸ©ãããã¡ãœããbar
ã«ã¢ã¯ã»ã¹ãããšã __get__
è¿ãé¢æ°ã®æ¹æ³BoundMethod
ã ãã®ãªããžã§ã¯ããåŒã³åºããããšãåºã«ãªãé¢æ°ãæåã®åŒæ°ãšããŠself
ïŒãã®å Žåã¯foo
ïŒã§åŒã³åºãããŸãã Javascriptãç§ãã¡ãåšãã«åæ Œããªããã°ãªããªãçç±ã§ããããã®æŠå¿µãæã£ãŠããŸãã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]é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){...}
ã²ãã¿ãŒãšã»ãã¿ãŒã¯ãObect.definePropertyãžã®1åã®åŒã³åºãã§å®çŸ©ãããŸãã ããã¯ãããjsã®çã§ãããsetãšgetã®å®£èšã¯å¥ã ã§ãããå®éã«ã¯åãããããã£å®£èšã§ãã ã³ã³ãã€ã©ã®ãšã©ãŒãã§ãã¯ã¯ããŠãŒã¶ãŒãåå¥ã«èãããšãã«ãŠãŒã¶ãŒã«èŠåããããšã§ãã ãã³ã¬ãŒã¿ã¯ãããããã£èšè¿°åã«1åã ãé©çšãããŸãã
ã³ã³ãã€ã©ãŒã¯åãååã®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))
ã²ãã¿ãŒãšã»ãã¿ãŒã®äž¡æ¹ããã³ã¬ãŒããããšããã³ã¬ãŒã¿ãŒã®æ§ææ§ã厩ããŸãã
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ïŒ
確å®ã«ãªããŸã§ããŸãã¯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ããŒã ãè¡ã£ãŠããçŽ æŽãããä»äºã«æè¬ããŸãïŒ
ãã¡ããæ©èœè£
食ã¯å¿
èŠã§ãã
ã³ãŒãå
ã®ä»ã®ãªããžã§ã¯ããè£
食ããèšç»ããããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
ãã¡ããæ©èœè£ 食ã¯å¿ èŠã§ãã
ã³ãŒãå ã®ä»ã®ãªããžã§ã¯ããè£ é£Ÿããèšç»ããããŸããïŒ