2016-09-14 20 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);'也許更重要的是我不會丟失任何東西,它不能像我的例子中所示的那樣完成這次。謝謝。 –

相關問題