Я пытаюсь расширить класс двумя уровнями наследования с помощью шаблонов, как на следующей диаграмме:
![enter image description here](https://i.stack.imgur.com/ztQHn.png)
Первая попытка, я объявил BaseResourceTableComponent
как расширение BaseResourceListComponent<T extends BaseResourceModel>
:
export abstract class BaseResourceModel {
public id?: number;
}
export abstract class BaseResourceListComponent<T extends BaseResourceModel> {
public resources: T[] = [];
...
}
export abstract class BaseResourceTableComponent extends BaseResourceListComponent<T extends BaseResourceModel> { // <--- ERROR!
dataSource: MatTableDataSource<T>;
...
}
// now, the non abstract classes
export class User extends BaseResourceModel {
constructor(
public name?: string,
) {
super();
}
export class UserTableComponent extends BaseResourceTableComponent<User> {
...
}
Я получаю следующую ошибку:
ошибка TS2304: не удается найти имя 'T'.
Вторая попытка, я объявил BaseResourceTableComponent
как расширение BaseResourceListComponent<BaseResourceModel>
(без T extents
):
export abstract class BaseResourceModel {
public id?: number;
}
export abstract class BaseResourceListComponent<T extends BaseResourceModel> {
public resources: T[] = [];
...
}
export abstract class BaseResourceTableComponent extends BaseResourceListComponent<BaseResourceModel> {
dataSource: MatTableDataSource<BaseResourceModel>;
...
}
// now, the non abstract classes
export class User extends BaseResourceModel {
constructor(
public name?: string,
) {
super();
}
export class UserTableComponent extends BaseResourceTableComponent<User> { // <--- ERROR!
...
}
Проходит, ошибки в объявлении BaseResourceTableComponent
нет, но я далее получите следующую ошибку при объявлении UserTableComponent
:
ошибка TS2315: Тип 'BaseResourceTableComponent' не является универсальным c.
I я действительно запутался здесь!
Я что-то упустил? Обходные