reactjs - typekontroll Av AgGridReact


Jeg bruker Typescript med ag-grid med følgende konfigurasjon.

[email 
@ag-grid-community/[email 
@ag-grid-enterprise/[email 

Jeg har også brukt:

[email 
[email 
[email 
[email 

I begge tilfeller feiler følgende kode å typekontrollere. Merk at koden er tatt nesten ordrett fra nettbasert dokumentasjon på https://www.ag-grid.com/react-column-configuration/:

import React from 'react';
import { AgGridReact } from '@ag-grid-community/react';

export class Test extends React.Component {
  constructor(props: any) {
    super(props);
    this.state = {
      columnDefs: [
        { headerName: "Make", field: "make", sortable: true, filter: true}
      ],
      rowData: [
        { make: "Toyota"},
        { make: "Ford"},
        { make: "Porsche"}
      ]
    }
  }

  render() {
    return (
      <div className="ag-theme-alpine">
        <AgGridReact
            columnDefs={this.state.columnDefs}
            rowData={this.state.rowData}>
        </AgGridReact>
      </div>
    );
  }
}

Typescript klager med:

ERROR in /home/.../filename.tsx
[tsl] ERROR in /home/....tsx(23,40)
  TS2339: Property 'columnDefs' does not exist on type 'Readonly<{}>'.

ERROR in /home/.../filename.tsx
[tsl] ERROR in /home/.../tsx (24,37)
  TS2339: Property 'rowData' does not exist on type 'Readonly<{}>'.

Hvordan kan jeg komme forbi denne typekontrollfeilen?

Svar #1

Det som fungerte for meg, var å importere følgende type:

import { ColDef } from 'ag-grid-community';

... og deretter skrev inn columnDefs som ColDef[]. Det fjernet typen-sjekk problemet.

Svar #2

Det er ikke et problem med ag-grid, det handler om hvordan du definerte komponenten din. I koden din sier du:

export class Test extends React.Component {
 // ...
}

Hvis du ser på definisjonen av React.Component-typen, vil du se at den er generell og kan akseptere opptil tre typeargumenter:

interface Component<P = {}, S = {}, SS = any> {
 // ...
}

Den første typeargumentet, P, er typen til propsene. Den andre, S, er typen til staten, den tredje, SS, er typen til statssnapshottet, noe du ikke trenger å bry deg så mye om i ditt eksempel.

Siden du ikke oppgir noen typeargumenter til React.Component, bruker TypeScript standardene ({} for props og {} for state):

// To TypeScript your code looks like:
export class Test extends React.Component<{}, {}, {}> {
 //                                           ^
 //                              This is the type of your state
}

Så TypeScript tror at state til komponenten din er {} og derfor har ingen egenskap columnDefs eller rowData!

For å fikse dette, oppgi en type for din state:

interface TestState {
  columnDefs: SomeColumnType[];
  rowData: SomeRowObject[];
}

// You should also maybe define a type for props but that's not your question
export class Test extends React.Component<{}, TestState> {
  // WORKS!!!
}

Relaterte artikler