свойства разбивки таблицы на страницы не существуют для типа ‘TableInstance{}’

#reactjs #typescript #pagination #frontend #react-table

#reactjs #typescript #разбивка на страницы #интерфейс #react-table

Вопрос:

Я пытаюсь реализовать разбивку на страницы с помощью react-table. В большинстве руководств мы начинаем с этого:

 const {
        getTableProps,
        getTableBodyProps,
        headerGroups,
        page,
        prepareRow,
        visibleColumns,
        canPreviousPage,
        canNextPage,
        pageOptions,
        pageCount,
        gotoPage,
        nextPage,
        previousPage,
        setPageSize,
        state: { pageIndex, pageSize },
    } = useTable(
        {
            columns,
            data,
            defaultColumn: { Filter: DefaultColumnFilter },
            initialState: { pageIndex: 0, pageSize: 10 },
        },
  

В моем случае моя среда разработки говорит, что свойства:
страница,
canPreviousPage,
canNextPage,
pageOptions,
pageCount,
gotoPage,
следующая
страница, предыдущая страница, setPageSize

не существует для типа ‘TableInstance{}’.

После долгих исследований в www я не могу найти причину, по которой эти свойства отсутствуют в TableInstance. Как я могу использовать разбивку на страницы без этих свойств или есть способ заставить ее работать?

Я с нетерпением жду каждого ответа

Комментарии:

1. Можете ли вы поделиться ссылкой на учебное пособие, которое вы используете?

2. ofc, этот react-table.tanstack.com/docs/examples/pagination

3. Основная проблема заключается в том, что типы TS неверны! Если вы проверите index.d.ts file, @types/react-table вы увидите, например, setPageSize свойство, объявленное только внутри UsePaginationInstanceProps и UsePaginationInstanceProps не используемое нигде.

4. Возможно, разработчики этого пакета еще не обновили типы, в то время как сам пакет был перемещен в новую версию.

Ответ №1:

Создание react-table-config.d.ts файла со следующим содержимым устранило проблему для меня:

 import {
  UseColumnOrderInstanceProps,
  UseColumnOrderState,
  UseExpandedHooks,
  UseExpandedInstanceProps,
  UseExpandedOptions,
  UseExpandedRowProps,
  UseExpandedState,
  UseFiltersColumnOptions,
  UseFiltersColumnProps,
  UseFiltersInstanceProps,
  UseFiltersOptions,
  UseFiltersState,
  UseGlobalFiltersColumnOptions,
  UseGlobalFiltersInstanceProps,
  UseGlobalFiltersOptions,
  UseGlobalFiltersState,
  UseGroupByCellProps,
  UseGroupByColumnOptions,
  UseGroupByColumnProps,
  UseGroupByHooks,
  UseGroupByInstanceProps,
  UseGroupByOptions,
  UseGroupByRowProps,
  UseGroupByState,
  UsePaginationInstanceProps,
  UsePaginationOptions,
  UsePaginationState,
  UseResizeColumnsColumnOptions,
  UseResizeColumnsColumnProps,
  UseResizeColumnsOptions,
  UseResizeColumnsState,
  UseRowSelectHooks,
  UseRowSelectInstanceProps,
  UseRowSelectOptions,
  UseRowSelectRowProps,
  UseRowSelectState,
  UseRowStateCellProps,
  UseRowStateInstanceProps,
  UseRowStateOptions,
  UseRowStateRowProps,
  UseRowStateState,
  UseSortByColumnOptions,
  UseSortByColumnProps,
  UseSortByHooks,
  UseSortByInstanceProps,
  UseSortByOptions,
  UseSortByState
} from 'react-table'

declare module 'react-table' {
  // take this file as-is, or comment out the sections that don't apply to your plugin configuration

  export interface TableOptions<D extends Record<string, unknown>>
    extends UseExpandedOptions<D>,
      UseFiltersOptions<D>,
      UseGlobalFiltersOptions<D>,
      UseGroupByOptions<D>,
      UsePaginationOptions<D>,
      UseResizeColumnsOptions<D>,
      UseRowSelectOptions<D>,
      UseRowStateOptions<D>,
      UseSortByOptions<D>,
      // note that having Record here allows you to add anything to the options, this matches the spirit of the
      // underlying js library, but might be cleaner if it's replaced by a more specific type that matches your
      // feature set, this is a safe default.
      Record<string, any> {}

  export interface Hooks<D extends Record<string, unknown> = Record<string, unknown>>
    extends UseExpandedHooks<D>,
      UseGroupByHooks<D>,
      UseRowSelectHooks<D>,
      UseSortByHooks<D> {}

  export interface TableInstance<D extends Record<string, unknown> = Record<string, unknown>>
    extends UseColumnOrderInstanceProps<D>,
      UseExpandedInstanceProps<D>,
      UseFiltersInstanceProps<D>,
      UseGlobalFiltersInstanceProps<D>,
      UseGroupByInstanceProps<D>,
      UsePaginationInstanceProps<D>,
      UseRowSelectInstanceProps<D>,
      UseRowStateInstanceProps<D>,
      UseSortByInstanceProps<D> {}

  export interface TableState<D extends Record<string, unknown> = Record<string, unknown>>
    extends UseColumnOrderState<D>,
      UseExpandedState<D>,
      UseFiltersState<D>,
      UseGlobalFiltersState<D>,
      UseGroupByState<D>,
      UsePaginationState<D>,
      UseResizeColumnsState<D>,
      UseRowSelectState<D>,
      UseRowStateState<D>,
      UseSortByState<D> {}

  export interface ColumnInterface<D extends Record<string, unknown> = Record<string, unknown>>
    extends UseFiltersColumnOptions<D>,
      UseGlobalFiltersColumnOptions<D>,
      UseGroupByColumnOptions<D>,
      UseResizeColumnsColumnOptions<D>,
      UseSortByColumnOptions<D> {}

  export interface ColumnInstance<D extends Record<string, unknown> = Record<string, unknown>>
    extends UseFiltersColumnProps<D>,
      UseGroupByColumnProps<D>,
      UseResizeColumnsColumnProps<D>,
      UseSortByColumnProps<D> {}

  export interface Cell<D extends Record<string, unknown> = Record<string, unknown>, V = any>
    extends UseGroupByCellProps<D>,
      UseRowStateCellProps<D> {}

  export interface Row<D extends Record<string, unknown> = Record<string, unknown>>
    extends UseExpandedRowProps<D>,
      UseGroupByRowProps<D>,
      UseRowSelectRowProps<D>,
      UseRowStateRowProps<D> {}
}
  

Как было предложено в:
https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react-table

Комментарии:

1. Большое вам спасибо 🙂

2. OP и @Muzaffer, я создал файл в разделе @types / react-table, но проблема все еще сохраняется, достаточно ли просто создать этот файл?

3. Куда вы поместили этот файл? Ваш проект или node_modules/@types/react-table?

4. Где должен быть размещен этот файл?

5. Он должен работать везде, где ваш проект может обнаружить файл. В документе предлагается поместить его в корень или в папку types

Ответ №2:

Возможно, это не самый «лучший» ответ. Однако, npm build если вы хотите запустить, вы не сможете, если не «исправите» ошибку отсутствующего типа. То, что я сделал, просто помещается @ts-ignore над подчеркнутыми фрагментами кода. Это выглядит примерно так:

     // @ts-ignore
    nextPage