TanStack/table · warning

filterFn '${String(column.columnDef.filterFn)}' for column '

Error message

filterFn '${String(column.columnDef.filterFn)}' for column '${column.id}' is not registered

What it means

column.getFilterFn resolves the filter function declared in columnDef.filterFn. When the resolved function is undefined (and the value isn't 'auto', which has its own warning), it warns that the named filter function is not registered and returns undefined, so the column effectively has no filtering.

Source

Thrown at packages/table-core/src/features/column-filtering/columnFilteringFeature.utils.ts:130

  TValue extends CellData = CellData,
>(
  column: Column_Internal<TFeatures, TData, TValue>,
): FilterFn<TFeatures, TData> | undefined {
  let filterFn = null
  const filterFns: Record<string, FilterFn<TFeatures, TData>> | undefined =
    column.table._rowModelFns.filterFns
  filterFn = isFunction(column.columnDef.filterFn)
    ? column.columnDef.filterFn
    : column.columnDef.filterFn === 'auto'
      ? column_getAutoFilterFn(column)
      : filterFns?.[column.columnDef.filterFn as string]

  if (
    process.env.NODE_ENV === 'development' &&
    !filterFn &&
    column.columnDef.filterFn !== 'auto' // the auto picker warns on its own
  ) {
    console.warn(
      `filterFn '${String(column.columnDef.filterFn)}' for column '${column.id}' is not registered`,
    )
  }

  return filterFn ?? undefined
}

/**
 * Checks whether column filtering is enabled for this accessor column.
 *
 * The column must have an accessor and filtering must be enabled by the column
 * definition, `enableColumnFilters`, and the table-wide `enableFilters` option.
 *
 * @example
 * ```ts
 * const canFilter = column_getCanFilter(column)
 * ```
 */

View on GitHub (pinned to d01c01bedb)

Solutions

  1. Register the filter function under exactly the name used in columnDef.filterFn.
  2. Fix typos in the filterFn string so it matches a registered (or built-in) name.
  3. Pass the function itself instead of a string: filterFn: myFilterFn.
  4. Verify you are importing/spreading the built-in filterFns if using built-in names in a custom setup.

Example fix

// before
{ accessorKey: 'age', filterFn: 'inNumberRange' } // never registered

// after
import { filterFns } from '@tanstack/table-core'
const table = createTable({
  /* ... */
  filterFns: { ...filterFns }, // 'inNumberRange' now resolvable
})
Defensive patterns

Strategy: validation

Validate before calling

function assertFilterFnRegistered(filterFns: Record<string, FilterFn<any>>, name: string | FilterFn<any> | undefined) {
  if (typeof name === 'string' && !(name in filterFns)) {
    throw new Error(`filterFn '${name}' referenced in a columnDef is not registered`)
  }
}

Type guard

function isRegisteredFilterFn(name: string, filterFns: Record<string, FilterFn<any>>): name is string {
  return name in filterFns
}

Try / catch

const fn = column.getFilterFn()
if (fn === undefined && typeof column.columnDef.filterFn === 'string') {
  console.warn(`Column '${column.id}' filterFn '${column.columnDef.filterFn}' unregistered; filtering disabled for this column`)
}

Prevention

When it happens

Trigger: Setting columnDef.filterFn to a string name (e.g. 'inNumberRange', 'myCustomFn') that does not exist in the filterFns registry: typos, custom functions used without registering them, using built-in names in a setup with a stripped-down feature set, or passing an object/function that failed to resolve.

Common situations: Copying column definitions between projects where the custom filterFn was registered elsewhere; registering filterFns under different keys than referenced in column defs; forgetting to register custom filter functions created with createFilterFn; version upgrades renaming built-in filter functions.

Related errors


AI-assisted analysis of TanStack/table@d01c01bedb (2026-08-28). Data as JSON: /api/errors/7cc16a034a9d035b. Report an issue: GitHub.