Рекомендуется и "позволительно" ли использовать дженерики таким образом?
Возникла необходимость в указании для поля строго литерального типа из перечня, чтобы в дальнейшем использовать это для указания компилятору (для функции). И вот пока это выглядит как-то так:
Общий тип:
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 нельзя, т.к. с ним планируются операции внутри конструктора.