reactjs - Modellklassdefinition med redux-orm och TypeScript


Jag använder redux-orm med JS och allt fungerar bra, men jag har problem med att översätta min kod från JS till TypeScript.

Jag har redan implementerat metoden render() i min Folder Model-klass, men TS-transpilatorn säger:

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

Hur kan jag indikera för TypeScript att name-egenskapen finns i Folder-instansobjekt?

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')
        };
    }
}

Svar #1

Du kan upprepa alla IFolder i class Folder

export class Folder extends Model<ModelFields, IFolder> implements IFolder {
    id: number;
    name: string;
    parent: any;
...

eller använd detta trick för att inte upprepa kod:

class IFolder extends Model<ModelFields, IFolder> {
    id: number;
    name: string;
    parent: any;
}

export class Folder extends IFolder {

Svar #2

Babel-transpileringsutdata introducerar ytterligare egenskapsbeskrivare i Model-prototypkedjan, vilket stör beskrivare som installerats av redux-orm under registrering av schemat. Detta är den grundläggande orsaken till felet Maximum call stack size exceeded.

@types/redux-orm för redux-orm:0.13 fungerar lite annorlunda.

Källan som tillhandahålls saknar ModelFields, så jag kommer att hoppa över dessa och anta att de förväntade fälten inkluderar:

  • id - attribut
  • name - attribut
  • parent - själv-refererande främmande nyckel

Exempel :

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')
    }
}

Typer för redux-orm 0.14 kommer sannolikt att utnyttja deklarationssammanfogning för att möjliggöra renare Model-definitioner.

Relaterade artiklar