2017-04-11 123 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

很好的答案。有趣的是,當我將鼠標懸停在「projection」的定義上時,'vscode'編輯器現在推斷出我的建議類型註釋。那麼,'projection'現在的確有一種類型,它不能用明確的類型註釋來表示。我以某種方式感覺這是語言中的一個缺陷,然後當我正在寫一個類型定義時,我需要使類型明確。 – dpoetzsch

+0

這是我發現的獨特方式。您可以使用命令'tsc your_file.ts -d'來使用打印機編譯器從該代碼中提取定義。不幸的是,你會看到像這樣的簽名:'... {[id:string]:this; }'不起作用。也許你可以用另一種方式使用泛型。 – Diullei

相關問題