Определение класса модели с использованием redux-orm и TypeScript
Я использую Redux-Orm с JS, и все работает нормально, но у меня возникают проблемы с переводом моего кода из JS в TypeScript.
Я уже реализовал метод render() в моем классе модели папок, но транспортер TS говорит:
Property 'name' does not exist on type 'Folder'
Как я могу указать TypeScript, что свойство name существует в экземплярах папок?
interface IFolder{
id: number;
name: string;
parent: any;
}
export class Folder extends Model<ModelFields, IFolder>{
static get modelName() {
return 'Folder';
}
get render(){
return (<p>{this.name}</p>)
}
static get fields() {
return {
id: attr(),
name: attr(),
parent: fk('Folder', 'children')
};
}
}
2 ответа
Вы можете повторить все IFolder
в class Folder
export class Folder extends Model<ModelFields, IFolder> implements IFolder {
id: number;
name: string;
parent: any;
...
или используйте этот трюк, чтобы не повторять код:
class IFolder extends Model<ModelFields, IFolder> {
id: number;
name: string;
parent: any;
}
export class Folder extends IFolder {
Вывод Babel Transpilation вводит дополнительные дескрипторы свойств в цепочку прототипов Model, которые мешают дескрипторам, установленным при помощи redux-orm во время регистрации схемы. Это коренная причина Maximum call stack size exceeded
ошибка.
@types/redux-orm
за redux-orm:0.13
работать немного по-другому.
В указанном источнике отсутствует ModelFields
, так что я пропущу это и предположу, что ожидаемые поля включают в себя:
- id - атрибут
- имя - атрибут
- parent - внешний ключ с собственной ссылкой
Пример:
interface FolderFields {
id: number;
name: string;
parent: Folder
children: QuerySet<Folder>
}
export class Folder extends Model<typeof Folder, FolderFields> {
static modelName = 'Folder' as const;
static fields = {
id: attr(),
name: attr(),
parent: fk('Folder', 'children')
}
}
Типы для redux-orm 0.14, скорее всего, будут использовать объединение объявлений, чтобы обеспечить более чистое Model
определения.