TypeScript 编译器与大型 inheritance/extension 链混淆
TypeScript compiler confused with large inheritance/extension chain
我有以下(相当复杂的)扩展链。这是我的问题的最小可重现示例(显然 classes 将在我的应用程序中具有行为实现)。
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
class 上找到 GridView
方法呢?
代码在 2.0.3
中编译正确,但在 1.8.10
中编译不正确。
这在 1.8.x
和 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);
似乎 1.8.x
编译器无法将 GridView
识别为构造函数:
IGridView<ItemView<BaseModel>, BaseModel>
我有以下(相当复杂的)扩展链。这是我的问题的最小可重现示例(显然 classes 将在我的应用程序中具有行为实现)。
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
class 上找到 GridView
方法呢?
代码在 2.0.3
中编译正确,但在 1.8.10
中编译不正确。
这在 1.8.x
和 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);
似乎 1.8.x
编译器无法将 GridView
识别为构造函数:
IGridView<ItemView<BaseModel>, BaseModel>