3

我正在使用带有 JS的 redux-orm并且一切正常,但是我在将我的代码从 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')
        };
    }
}
4

2 回答 2

0

你可以重复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 {

于 2019-06-10T21:16:30.840 回答
0

Babel 转译输出在模型原型链中引入了额外的属性描述符,这会干扰在模式注册期间由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定义。

于 2019-07-19T15:49:40.090 回答