2017-04-11 11 views
1
class A { 
    get projections(): { [id: string]: this } { ... } 
} 

class B extends A {} 

new B().projections // should be { [id: string]: B } 

ただし、タイプスクリプトでは、この位置にthisタイプが許可されていません。私が欲しいものを表現する方法はありますか?またはそれがうまくいかない理由は何ですか?Typescript:このタイプのオブジェクトタイプ

+1

'this'はクラス自体ではなく、オブジェクトの特定のインスタンスを指します。それがうまくいかない理由です。 –

答えて

1

thisは、この方法では使用できません。あなたが望むものを達成するためのコードを提案しましょう。

class A { 
    get projections() { 
     // ... 
     let result = {}; // <-- your return object 
     return (<T>(obj: T): { [id: string]: T } => result)(this); 
    } 
} 

class B extends A {} 

new B().projections // => { [id: string]: B } 

私は無名関数を使用するために好きではないと思いますが、これは、私はあなたの結果を得るために見つける方法でした。

あなたは、コードを読みやすくするためにAにプライベートヘルプ機能を作成することができます。

class A { 
    private applyResult<T>(obj: T, result: { [id: string]: T }) { 
     return result; 
    } 

    get projections() { 
     // ... 
     let result = {}; // <-- your return object 
     return this.applyResult(this, result); 
    } 
} 

class B extends A {} 

new B().projections // => { [id: string]: B } 

私は、これはいくつかの方法で役立ちます願っています。

+0

ニースの答え。面白いことに 'vscode'エディタは、' projections'の定義にマウスポインタを合わせると、私の提案する型名を正確に推測します。それで、 '投影法 'が明示的な型名を使って表現できない型を持つのは本当ですか?私は何とかこれが言語の欠陥であると感じ、そのタイプを明示するためにタイプ定義を書いています。 – dpoetzsch

+0

それは私がそれをするために見つけたユニークな方法です。 'tsc your_file.ts -d'コマンドを使ってtypescriptコンパイラを使ってこのコードから定義を抽出することができます。残念ながら、あなたは次のような署名を見るでしょう: '{{id:string}:this; } 'は動作しません。多分あなたはジェネリックスを使って別の方法でそれを行うことができます。 – Diullei

関連する問題