Определение класса модели с использованием redux-orm и TypeScript - PullRequest
1 голос
/ 10 июня 2019

Я использую 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 ]

0 голосов
/ 19 июля 2019

Вывод Babel Transpilation вводит дополнительные дескрипторы свойств в Model цепочку прототипов, которые мешают дескрипторам, установленным redux-orm во время регистрации схемы. Это основная причина ошибки Maximum call stack size exceeded.

@types/redux-orm для redux-orm:0.13 работают немного по-другому.

В указанном источнике отсутствует ModelFields, поэтому я пропущу их и предположу, что в ожидаемые поля входят:

  • id - атрибут
  • имя - атрибут
  • parent - внешний ключ с собственной ссылкой
* 1 028 * Пример:
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.

0 голосов
/ 11 июня 2019

Вы можете повторить все 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 {

...