TypeScript сочетает псевдонимы типов с наследованием и обобщениями - PullRequest
0 голосов
/ 02 августа 2020

В моем коде есть несколько глубоко унаследованных классов в сочетании с дженериками и композицией. Во многих более высоких классах, которые используют сервисы, адаптированные для комбинации одной и той же иерархии, я вынужден указывать полную иерархию для каждого типа, хотя ее можно вывести из типов, которые я уже определил, это затрудняет чтение кода, затрудняет чтение. правильно и сложно поддерживать (когда я хочу переключить тип, мне нужно сделать это, например, во всех местах).

Я думал об использовании определения типа в своих файлах, но в сочетании с дженериками, и поскольку он определен вне класса. Мне трудно добиться этого.

Вот сокращенный пример проблемы:

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 не должен использоваться подобным образом в псевдонимах типов.

Есть ли способ заставить псевдонимы типов работать подобным образом? Может быть, есть другое, может быть, даже лучше? (без создания дополнительных типов ..)

...