2016-11-08 90 views
0

我有以下(相當複雜)的擴展鏈。這是我的問題的一個最小可重現的例子(顯然這些類將在我的應用程序中有行爲實現)。與大型繼承/擴展鏈混淆的TypeScript編譯器

export class BaseModel 
{ 
    public someBaseModelMethod(): void { } 
} 

export class BaseView 
{ 
    public someBaseViewMethod(): void { } 
} 

export class CollectionView<TChildView extends BaseView, TModel extends BaseModel> 
    extends BaseView 
{ 
    public someCollectionViewMethod(): void { } 
} 

export class ItemView<TModel extends BaseModel> 
    extends BaseView 
{ 
    public setItem(model: TModel): void { } 
} 

export interface IGridView<TChildView extends ItemView<TModel>, TModel extends BaseModel> 
    extends CollectionView<TChildView, TModel> 
{ 
    someGridViewMethod(): void; 
} 

export class GridView<TChildView extends ItemView<TModel>, TModel extends BaseModel> 
    extends CollectionView<TChildView, TModel> 
    implements IGridView<TChildView, TModel> 
{ 
    public someGridViewMethod(): void { } 
} 

function bind<TInterface>(key: string, implementation: new (...args: any[]) => TInterface) { 
    // do some bindings here 
} 

bind<IGridView<ItemView<BaseModel>, BaseModel>>("IGridView", GridView); 

當我編譯,我得到的最後一行(bind語句)的GridView部分錯誤。錯誤如下:

TS2345 Argument of type 'typeof GridView' is not assignable to parameter of type 'new (...args: any[]) => IGridView<ItemView<BaseModel>, BaseModel>'. 
    Type 'CollectionView<any, any>' is not assignable to type 'IGridView<ItemView<BaseModel>, BaseModel>'. 
     Property 'someGridViewMethod' is missing in type 'CollectionView<any, any>'. 

正如你所看到的,它期待someGridViewMethod是在CollectionView。然而,GridView延伸CollectionView,那麼爲什麼期望在CollectionView類找到GridView方法?


的代碼編譯正確的2.0.3,但不是在1.8.10

+1

此代碼,當被複制到操場時,不會產生錯誤 –

+0

對不起@NitzanTomer,我有約會我的問題 - 它在2.0.3中編譯正確,但不在1.8.10中編譯 –

回答

1

這將編譯兩個1.8.x2.x罰款:

type TypedGridView = { new (...args: any[]): IGridView<ItemView<BaseModel>, BaseModel> }; 

function bind<TInterface>(key: string, implementation: new (...args: any[]) => TInterface) { 
    // do some bindings here 
} 

bind("IGridView", GridView as TypedGridView); 

code in playground

看來,1.8.x編譯器無法識別GridView作爲一個構造函數:

IGridView<ItemView<BaseModel>, BaseModel>