2016-08-09 15 views
0

JavaScriptでは、配列の反復処理にネイティブな構文がないため、[].forEach((item)=>{...})を使用するのが一般的です。
しかし、そのクロージャはthisの値を変更します。TypeScript: "this" of "parent"関数へのアクセス(JavaのようなMyClass.this)

Javaの場合、そのような場合は、MyClass.thisという構文があり、これは "上位" thisを参照できます。

TypeScriptのようなものがありますか?または計画ですか?私はthis参照を格納するために蒸散されていると想像することができ、閉鎖でそれを使用します。

コード:

public fromJSON(input: Object, clazz?: typeof FrameModel): T 
{ 
    const service_this = this; 
    if (clazz === void 0){ 
     var disc = input[GraphJSONtoTsModelsService.DISCRIMINATOR]; 
     if (disc instanceof Array) 
      disc = disc[0]; 
     if (disc === void 0) 
      throw new Error(`Given object doesn't specify "${GraphJSONtoTsModelsService.DISCRIMINATOR}" and no target class given: ` + JSON.stringify(input)); 
     clazz = this.getTypeScriptClassByDiscriminator(disc); 
    } 

    if (clazz == null){ 
     throw new Error(`No class found for discriminator ${disc}: ` + JSON.stringify(input)); 
    } 

    let result = new FrameModel(input["_id"]); 
    //result.setVertexId(input["_id"]); 
    //console.log("We have a frame now: " + result); 

    //for (let name in Object.getOwnPropertyNames(input)){ 
    let propNames = Object.getOwnPropertyNames(input); 
    for (let i = 0; i < propNames.length; i++) { 
     let name = propNames[i]; 
     let val = input[name]; 
     // Properties 
     if (typeof val === 'string' || typeof val === 'number'){ 
      let beanPropName = clazz.graphPropertyMapping[name] || name; // Use same if not defined. 
      result[beanPropName] = val; 
     } 
     // Adjacent - input prop name is graph edge name. 
     if (typeof val === 'object'){ 
      let beanPropName = clazz.graphRelationMapping[name] || name; // Use same if not defined. 
      let info = RelationInfo.parse(beanPropName); 

      //console.log(`propName: ${name} beanPropName: ${beanPropName} isArray: ${isArray}`); 
      let direction = val["direction"]; 
      let items = []; 
      if (val["vertices"] instanceof Array) { 
       val["vertices"].forEach((vertex) => { 
        let item: Object; 
        let mode = vertex[GraphJSONtoTsModelsService.MODE] || "vertex"; 
        if (mode == "vertex") 
         item = service_this.fromJSON(vertex); 
        else if (mode == "link") 
        { 
         let link: string = vertex["link"]; 
         item = service_this.fromLink(link); 
        } 
        //console.log(`item: ${item} vertex: ${JSON.stringify(vertex)}`); 
        items.push(item); 
       }); 
      } 
      result[info.beanPropName] = info.isArray ? items : (items[0]); 
     } 
    } 

    return <T> result; 
} 
+0

実際、矢印関数は 'this'のコンテキストを保存しません。そして、いいえ、JavaのClass.thisに相当するjs/tsはありません。 –

+0

どこに保存?ラムダ内の 'this'は別のオブジェクトを指し、コンストラクタ' Function'を指します。これはラムダそのものです。 –

+0

コードを追加しました。私はまた、喜んで質問に関係のないヒントを受け入れる;-) –

答えて

1

はあなたがあなたの本当のコードが含まれていなかったので、私はあなたが言及したこの[].forEach((item)=>{...});を実行する方法を知りませんが、矢印機能がthisのためのコンテキストを保持しません。

MDN it says:

で矢印関数式は、関数 表現に比べて短い構文を持っており、字句

そして...この値をバインドします

矢印関数は独自のコンテキストを作成しません。むしろ は、囲むコンテキストのこの値を取り込みますo次の コードは期待通りに動作します。 typescript docs it says

Arrow functions capture the this where the function is created rather than where it is invoked 

そして、ここでは例です:

class A { 
    private factor: number; 

    constructor(factor: number) { 
     this.factor = factor; 
    } 

    public multiply(items: number[]): number[] { 
     return items.map(item => item * this.factor); 
    } 
} 

let a = new A(2); 
a.multiply([1, 2, 3, 4, 5]); // [2, 4, 6, 8, 10] 

code in playground

これはあなたのために動作しない場合は、その後にあなたの質問を更新してくださいあなたが問題を抱えている実際のコード

+0

私は間違った構文を使用しているのでしょうか? '(...)=> {...}' –

+0

他の構文は同じJSを生成します。私は自分のコードでもう一度チェックします。 –

+0

再現できません。私は自分のコードにいくつかの不具合があったと思う。ありがとう! –

関連する問題