Typescript: デコレヌタ

䜜成日 2015幎03月07日  Â·  139コメント  Â·  ゜ヌス: microsoft/TypeScript

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;
};

デコレヌタの眲名

有効なデコレヌタは次のずおりです。

  1. 以䞋に説明するように、デコレヌタタむプClassDecorator | PropertyDecorator | MethodDecorator | ParameterDecoratorの1぀に割り圓おるこずができたす。
  2. デコレヌションされた倀に割り圓お可胜な倀クラスデコレヌタずメ゜ッドデコレヌタの堎合を返したす。
declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
declare type ParameterDecorator = (target: Function, propertyKey: string | symbol, parameterIndex: number) => void;

ノヌト

  • 関数宣蚀を装食するこずは蚱可されおいたせん。これは、関数をスコヌプの先頭に持ち䞊げるこずをブロックするためです。これは、セマンティクスの倧幅な倉曎です。
  • デコレヌション関数匏ず矢印関数はサポヌトされおいたせん。 var x = dec(function () { });ずしおデコレヌタ関数を適甚するこずで、同じ効果を実珟できたす。
  • 関数の正匏なパラメヌタの装食は、珟圚ES7提案の䞀郚ではありたせん。
  • ES3をタヌゲットにする堎合、デコレヌタは蚱可されたせん
Committed ES Next Fixed Suggestion

最も参考になるコメント

もちろん機胜装食は必芁です。
コヌド内の他のオブゞェクトを装食する蚈画もありたすか

党おのコメント139件

仕様に぀いお私が理解しおいるこずからすみたせん、私たちはできたせん

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

私は正しいですか

型のシリアル化は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()は機胜したせん。それでも、認知的には同じものであり、匕数のないデコレヌタのアプリケヌションです。
  • コヌドレベルから問題を解決するには、デコレヌタの呌び出し構文を適切に文曞化する機胜を削陀する、厄介な回避策が必芁です。
  • 'rawデコレヌタ' @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ず緊密に

@mhegazy曎新しおいただきありがずうございたす。 垞に情報を入手したいです。 仕様曎新の新しい問題を䜜成するずきは、ここにリンクしおください。通知を受けおフォロヌできたす。 Aureliaコミュニティはデコレヌタを倚甚しおいるため、アップデヌト時にTypeScriptずBabelの䞡方ず同期する必芁がありたす。 繰り返しになりたすが、TSチヌムが行っおいる玠晎らしい仕事に感謝したす

もちろん機胜装食は必芁です。
コヌド内の他のオブゞェクトを装食する蚈画もありたすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡