Zoeken op website

typescript - Aangepast type definiëren voor Tanstack Table FilterFuntion


Ik heb een aangepaste filterfunctie geschreven voor Tanstack Table die gebruikmaakt van fuse.js.

Echter, TypeScript klaagt over al mijn pogingen om het type van mijn aangepaste functie te definiëren.

Ik wil dat mijn functie voldoet aan deze type-definitie

export interface FilterFn<TData extends RowData> {
    (row: Row<TData>, columnId: string, filterValue: any, addMeta: (meta: FilterMeta) => void): boolean;
    resolveFilterValue?: TransformFilterValueFn<TData>;
    autoRemove?: ColumnFilterAutoRemoveTestFn<TData>;
}

Dit is mijn functie. Ik zou graag TData in plaats van any willen gebruiken, maar ik weet niet precies hoe.

/**
 * FilterFunction for Tanstack Table incorporating fuse's fuzzy search
 */
export const fuseFilterFn: FilterFn<any> = (
  row,
  columnId,
  filterValue,
  addMeta
) => {
  const searchPattern = filterValue.toString();

  const fuse = new Fuse([row.getValue(columnId)]);
  const searchResults = fuse.search(searchPattern);

  if (searchResults.length > 0) {
    // If any search result is found, consider the row as a match
    addMeta({ searchResults }); // Optionally, add any metadata for the search results
    return true;
  }

  return false;
};

Dit is mijn tafel

interface DataTableProps<TData, TValue> {
  columns: ColumnDef<TData, TValue>[];
  data: TData[];
  columnFilters?: ColumnFilter[];
}

export function Table<TData, TValue>({
  data,
  columns,
  columnFilters = [],
}: DataTabelProps<TData, TValue>) {
  const [sorting, setSorting] = useState<ColumnSort[]>([]);
  const [filtering, setFiltering] = useState('');

  const table = useReactTable({
    data,
    columns,
    getCoreRowModel: getCoreRowModel(),
    getSortedRowModel: getSortedRowModel(),
    getPaginationRowModel: getPaginationRowModel(),
    getFilteredRowModel: getFilteredRowModel(),
    state: {
      sorting: sorting,
      globalFilter: filtering,
      columnFilters: columnFilters,
    },
    globalFilterFn: fuseFilterFn,
    onSortingChange: setSorting,
    onGlobalFilterChange: setFiltering,
  });

Antwoord #1

Om te voorkomen dat het van het type Any is, moet je het type opgeven.

Voorbeeld :

/**
* Here you define your type.
*/
type YourGenericTypeHere = {
  stringprop: string,
  numprop: number,
  recordprop: Record<string,any>,
  optional?: string,
  objectprop: Object
}

// Here you define the columnDefinition and pass the type you defined earlier
export const columns: ColumnDef<YourGenericTypeHere>[] = [{
id: "someidyouchose",
header: ({table}) => (<CustomHeaderElement/>),
// ... etc
}]
/**
 * 
 *
 * We also have to pass the Type definition to the filter, otherwise we don't 
 * know what to filter
 */
export const fuseFilterFn: FilterFn<YourGenericTypeHere> = (
  row,
  columnId,
  filterValue,
  addMeta
) => {
  const searchPattern = filterValue.toString();

  const fuse = new Fuse([row.getValue(columnId)]);
  const searchResults = fuse.search(searchPattern);

  if (searchResults.length > 0) {
    // If any search result is found, consider the row as a match
    addMeta({ searchResults }); // Optionally, add any metadata for the search results
    return true;
  }

  return false;
};

Geef dan op de plaats waar je de tabel daadwerkelijk weergeeft, de geïmporteerde kolomeigenschap

Het gegevenstype moet YourGenericTypeHere zijn en de kolommen hebben ook hetzelfde type.

<DataTable data={data} columns={columns} />