【发布时间】:2021-10-09 21:37:50
【问题描述】:
背景
我想创建以下结构(蓝色是抽象的,绿色是具体的):
于是我关注this answer 并创建了以下代码:
export abstract class BaseResourceModel {
public id?: string;
}
type ConcreteClass<C> = new (...args: any[]) => C;
export interface IBaseList<T extends BaseResourceModel>
extends ConcreteClass<BaseList<T>> {
}
export function TableMixin<T extends BaseResourceModel>() {
return function <B extends IBaseList<T>>(Base: B){
class Temporary extends Base implements OnInit {
(...)
}
return Temporary;
};
}
@Component({ template: '' })
export abstract class BaseList<T extends BaseResourceModel>
implements OnInit, OnDestroy {
(...)
}
@Component({ template: '' })
export abstract class BaseServerList<T extends BaseResourceModel> extends BaseList<T> {
(...)
}
问题
我不知道如何创建从 BaseServerList 扩展而来的抽象 BaseServerTable 并由 TableMixin 组成,并在其上保留通用 <T extends BaseResourceModel>。我收到以下错误:
- 第一次尝试:
class DummyBaseServerList<T> extends BaseServerList<T> { }
@Component({ template: '' })
class BaseServerTable<T> extends TableMixin<BaseResourceModel, typeof DummyBaseServerList>()(BaseServerList<T>) {
(...)
}
结果:Expected 1 type arguments, but got 2.ts(2558)
- 第二次尝试:
class DummyBaseServerList<T> extends BaseServerList<T> { }
@Component({ template: '' })
class BaseServerTable extends TableMixin<BaseResourceModel>()(DummyBaseServerList) {
(...)
}
结果:No base constructor has the specified number of type arguments.ts(2508)
- 第三次尝试:
@Component({ template: '' })
class BaseServerTable<T> extends TableMixin<BaseResourceModel>()(BaseServerList<T>) {
(...)
}
结果:Value of type 'typeof BaseServerList' is not callable. Did you mean to include 'new'?ts(2348)
问题
如何实现这种模式?我错过了什么?我到处搜索关于这样的模式的样本
【问题讨论】:
标签: angular typescript generics subclass mixins