2016-09-14 58 views
0

我想更好地理解型inferance规则,我有一个绊倒了我一个人为的例子:如何正确地分配相关类型的方法

的设置:

interface Model{ 
    label?: string; 
} 

interface View<T>{ 
    cid?: string; 
    model?: T; 
} 

class Foo { 
    findWithModel<TModel extends Model, TView extends View<TModel>>(value: TModel): TView; 
    findWithModel(value: string): any { 
     return {cid: "2"}; 
    } 
} 

class AModel implements Model{ 
    constructor(public label: string){} 
} 

class AView<T extends Model> implements View<T>{ 
    cid = "1"; 
    model = null; 
} 

let f = new Foo(); 
let model = new AModel("test"); 

所以我有过载,findWithModel在一个情况下,它返回any和其他应有效地将一个返回SomeView<SomeModel>的问题就会出现,如下:

let trial1 = f.findWithModel<AView<AModel>, AModel>(model); 
let trial2: AView<AModel> = f.findWithModel(model); 

所以trial1,工作,但显然这是相当冗长的,为什么打扰的点。好像额外的工作来传递AModel2X

所以我以为,你知道,我就应该能够提供对结果的声明,trial2类型信息,但打字稿则认为,作为:

Foo.findWithModel<AModel, {}>(value: AModel): {} 

这显然失败:

Property 'cid' is missing in type '{}' 

这甚至可能拉断,而不过于冗长调用,我通过AModel2x

回答

0

如果你不介意回View<T>,而不是你在通用约束通过更具体的类型,那么你可以这样做:

findWithModel<TModel extends Model>(value: TModel): View<TModel> { 
    ... 
} 

let trial1 = f.findWithModel(model); // type of trail1 is View<AModel> 
+0

不够公平!使用它我也可以将它转换为更具体的类型'let result = > f.findWithModel(model);'也许更重要的是我不会丢失任何东西,它不能像我的例子中所示的那样完成这次。谢谢。 –