В моем коде есть несколько глубоко унаследованных классов в сочетании с дженериками и композицией. Во многих более высоких классах, которые используют сервисы, адаптированные для комбинации одной и той же иерархии, я вынужден указывать полную иерархию для каждого типа, хотя ее можно вывести из типов, которые я уже определил, это затрудняет чтение кода, затрудняет чтение. правильно и сложно поддерживать (когда я хочу переключить тип, мне нужно сделать это, например, во всех местах).
Я думал об использовании определения типа в своих файлах, но в сочетании с дженериками, и поскольку он определен вне класса. Мне трудно добиться этого.
Вот сокращенный пример проблемы:
export class BaseLine {
}
export class BaseHeader<TLines extends BaseLine> {
lines: TLines[];
}
export class ServiceA
<THeader extends BaseHeader<TLines>,
TLines extends BaseLine> {
}
export class ServiceB
<THeader extends BaseHeader<TLines>,
TLines extends BaseLine> {
}
export class HeaderDetail
<THeader extends BaseHeader<TLines>,
TLines extends BaseLine> {
serviceA: ServiceA<THeader, TLines>;
serviceB: ServiceB<THeader, TLines>;
}
Теперь представьте, что существует более двух типов универсальных шаблонов для класса более двух служб, и я получаю файл, заполненный наполовину типами. Псевдонимы типов действительно могут иметь значение здесь, то, что я действительно хотел бы сделать, это что-то вроде:
type TLines = any extends BaseLine;
export class BaseHeader<TLines> {
lines: TLines[];
}
type TLines = any extends BaseLine;
type THeader = any extends BaseHeader<TLines>;
export class ServiceA <THeader> {
}
type TLines = any extends BaseLine;
type THeader = any extends BaseHeader<TLines>;
export class Service <THeader> {
}
type TLines = any extends BaseLine;
type THeader = any extends BaseHeader<TLines>;
export class HeaderDetail <THeader> {
serviceA: ServiceA<THeader>;
serviceB: ServiceB<THeader>;
}
Но я не могу найти правильный способ сделать это, ts продолжает давать нам crypti c ошибка: '?' Ожидается, я предполагаю, что это так, поскольку синтаксис extends не должен использоваться подобным образом в псевдонимах типов.
Есть ли способ заставить псевдонимы типов работать подобным образом? Может быть, есть другое, может быть, даже лучше? (без создания дополнительных типов ..)