Определение класса модели с использованием 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 определения.

Другие вопросы по тегам