【问题标题】:Model Class definiton using redux-orm and TypeScript使用 redux-orm 和 TypeScript 定义模型类
【发布时间】:2019-10-25 06:12:37
【问题描述】:

我将 redux-orm 与 JS 一起使用,一切正常,但我在将代码从 JS 转换为 TypeScript 时遇到问题。

我已经在我的文件夹模型类中实现了方法 render(),但是 TS 转译器说:

Property 'name' does not exist on type 'Folder'

如何指示 TypeScript 在 Folder 实例中存在 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')
        };
    }
}

【问题讨论】:

    标签: reactjs typescript redux redux-orm


    【解决方案1】:

    Babel 转译输出在 Model 原型链中引入了额外的属性描述符,这会干扰 redux-orm 在模式注册期间安装的描述符。这是Maximum call stack size exceeded 错误的根本原因。

    @types/redux-ormredux-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 定义。

    【讨论】:

      【解决方案2】:

      你可以在class Folder中重复所有IFolder

      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 {
      
      

      【讨论】:

      • 感谢@aquz 我已经尝试过该解决方案,但是当我想使用此行创建文件夹实例时出现此错误,该行在使用 JS 时可以正常工作:Folder.create (sf) index.js:1375 RangeError: Maximum call stack size exceeded at SessionBoundModel.update (Model.js:538) at SessionBoundModel.set (Model.js:518) at SessionBoundModel.set [as id] (descriptors.js:25) at new Folder (index.tsx:107)
      猜你喜欢
      • 2018-08-31
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      相关资源
      最近更新 更多