ИМХО, методы экземпляра класса и записи действительно плохо сочетаются.
Методы записи (например, .set
) не поддерживают цепочку прототипов, потому что они возвращают новую запись, как если бы вы имелиснова позвонил на завод.Проблема в том, что isSomePropFancy
определено в SpecificClass.prototype, поэтому вы потеряете доступ к нему при создании новой записи.
Вы можете использовать переопределение метода, как у вас, для каждого метода записи (хотяЯ не думаю, что ваш будет работать так, как у вас):
const SpecificRecord = Record({id: 0, someProp: ''});
export default class SpecificClass extends SpecificRecord {
id: number;
someProp: string;
constructor(id, someProp) {
super({id, someProp});
}
isSomePropFancy = () : boolean => {
return this.someProp === 'fancy';
}
set = (key, value): SpecificClass => {
const values = {...this, [key]: value};
return new SpecificClass(values.id, values.someProp);
};
// also need to define merge, delete, etc.
}
или установить isSomePropFancy
в записи как свойство:
const SpecificRecord = Record({
id: 0,
someProp: '',
isSomePropFancy: (): boolean => this.someProp === 'fancy'
});
export default class SpecificClass extends SpecificRecord {
id: number;
someProp: string;
isSomePropFancy: () => boolean;
constructor(id, someProp) {
super({id, someProp});
}
}
В любом случае,в качестве примечания, я настоятельно рекомендую, чтобы конструктор брал объект вместо отдельных параметров.Это делает внутреннюю логику и использование проще и удобнее в обслуживании.Вам даже не нужно определять конструктор.
(например, new SpecificClass({id: 1, someProp: 'not-fancy'})
вместо new SpecificClass(1, 'not-fancy')
)
Мы используем TS и записи, и я убедил мою команду, что он намного чищевообще не оборачивать типы записей в классах, а просто вводить фабрики как есть.