Рекомендуется и "позволительно" ли использовать дженерики таким образом?

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

Общий тип:

type NameType = 'John' | 'Stepan';

Объект документов:

const documents = {
    'John': {
        'cardId': 12
    },
    'Stepan': {
        'hasPass': true
    }
} satisfies Record<NameType, Object>;

Классы:

abstract class Person<T extends NameType>{
    public readonly name: T;

    constructor(name: T){
        this.name = name;
    }

    protected _getDocument<K extends keyof typeof documents[T]>(document: K): typeof documents[T][K]{
        return documents[this.name][document];
    }
}

class John extends Person<'John'>{
    constructor(){
        super('John');
    }
}

class Stepan extends Person<'Stepan'>{
    constructor(){
        super('Stepan');
    }
}

И тут вопрос - позволительно ли так использовать дженерики? Вроде как они обычно используются не для указания типа всего-то одного поля, а как например в случае с классом Stack - где от указанного типа зависит то, какие элементы будут.

Возможно есть ещё какое-то другое решение, где не придётся подобным образом использовать дженерики? И да, сделать абстрактным поле name в классе Person нельзя, т.к. с ним планируются операции внутри конструктора.


Ответы (0 шт):