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

相关问题