2016-11-08 2 views
0

Ich habe die folgende (einigermaßen komplexe) Verlängerungskette. Es ist ein minimales reproduzierbares Beispiel meines Problems (offensichtlich werden die Klassen Verhaltensimplementierungen in meiner Anwendung haben).TypeScript Compiler mit großer Vererbung/Erweiterung Kette verwechselt

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); 

Wenn ich kompilieren, erhalte ich einen Fehler auf dem GridView Teil der letzten Zeile (die bind Anweisung). Der Fehler ist wie folgt:

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>'. 

Wie Sie sehen können, ist es someGridViewMethod erwartet auf CollectionView zu sein. Jedoch GridViewerweitertCollectionView, also warum erwartet es GridView Methoden auf der CollectionView Klasse zu finden?


Der Code kompiliert korrekt in 2.0.3, aber nicht in 1.8.10.

+1

Dieser Code , wenn auf Spielplatz kopiert, produziert keine Fehler –

+0

Sorry @NitzanTomer, ich habe auf datierte meine Frage - es kompiliert korrekt in '2.0.3' aber nicht in' 1.8.10' –

Antwort

1

Dies kompiliert sowohl 1.8.x Fein- und 2.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)

Es scheint, dass der 1.8.x Compiler GridView als Konstruktor verkennt:

IGridView<ItemView<BaseModel>, BaseModel> 
Verwandte Themen