Есть ли способ присвоить псевдоним универсальному типу с длинной ветвью в области класса?

#typescript #generics

#typescript #универсальные типы

Вопрос:

У меня есть общий класс репозитория, использующий общий тип объекта / документа, который выглядит примерно так:

 type IEntity<TData extends {}, TType extends string = string> = TData amp; {
    id: string;
    type: TType;
    createdAtIso: string;
}

class Repository<TData extends {}, TType extends string = string> {
    constructor(private _type: TType) { }

    save(data: TData): IEntity<TData, TType> {
        return this._save({
            id: 'asdf',
            type: this._type,
            createdAtIso: new Date().toISOString(),
            ...data
        });
    }

    _save(entity: IEntity<TData, TType>): IEntity<TData, TType> {
        // save entity here
        return entity;
    }
}
  

Суть в том, чтобы инкапсулировать ведение бухгалтерского учета в TEntity, и чтобы код, использующий репозиторий, заботился только о том, что он конкретно хочет сохранить.

Тем не менее, это означает, что конструкция IEntity<TData, TType> повторяется миллион раз в классе репозитория. На верхнем уровне модуля я мог бы использовать type псевдоним для создания более короткого имени для типа; есть ли какая-либо конструкция, которую я мог бы использовать для псевдонимирования типа в объявлении класса, используя аргументы универсального типа, которые он принимает?

Комментарии:

1. Вы могли бы использовать параметр type в качестве своего рода псевдонима типа, но это имело бы ограничивающие последствия. Обсуждалась возможность разрешить псевдонимы типов в классах, но, похоже, это ни к чему не привело github.com/Microsoft/TypeScript/issues/7061

2. @TitianCernicova-Dragomir — к сожалению, насколько я могу судить, это не очень полезно; TS (правильно) предполагает, что аргумент может быть любым произвольным подтипом ограничения параметра, т. Е. может иметь дополнительные требуемые свойства, поэтому вы не можете осмысленно вернуть экземпляр подтипа.

3. Да, это не очень хорошее решение, поэтому я не опубликовал его в качестве ответа. Не думаю, что мы можем сделать лучше прямо сейчас.