TanStack/table · warning

globalFilterFn '${String(globalFilterFn)}' is not registered

Error message

globalFilterFn '${String(globalFilterFn)}' is not registered

What it means

This dev-mode warning fires when `table.options.globalFilterFn` is set to a string (not 'auto', not a function) that has no matching entry in the table's filterFns registry (`table._rowModelFns.filterFns`). The library cannot resolve the named filter function, so global filtering silently becomes a no-op (the resolver returns `undefined`). It only logs in development; in production the misconfiguration is invisible except that filtering does nothing.

Source

Thrown at packages/table-core/src/features/global-filtering/globalFilteringFeature.utils.ts:82

>(
  table: Table_Internal<TFeatures, TData>,
): FilterFn<TFeatures, TData> | undefined {
  const { globalFilterFn: globalFilterFn } = table.options
  const filterFns: Record<string, FilterFn<TFeatures, TData>> | undefined =
    table._rowModelFns.filterFns

  const filterFn = isFunction(globalFilterFn)
    ? globalFilterFn
    : globalFilterFn === 'auto'
      ? table_getGlobalAutoFilterFn()
      : filterFns?.[globalFilterFn as string]

  if (
    process.env.NODE_ENV === 'development' &&
    !filterFn &&
    globalFilterFn != null
  ) {
    console.warn(`globalFilterFn '${String(globalFilterFn)}' is not registered`)
  }

  return filterFn
}

/**
 * Routes a global filter updater through the table's global filter handler.
 *
 * The updater may be a next value or a function of the previous value, matching
 * the instance `table.setGlobalFilter` behavior.
 *
 * @example
 * ```ts
 * table_setGlobalFilter(table, 'search text')
 * ```
 */
export function table_setGlobalFilter<
  TFeatures extends TableFeatures,

View on GitHub (pinned to d01c01bedb)

Solutions

  1. Check the exact string passed to `globalFilterFn` against the keys of the object passed as the filterFns registry; fix typos/case mismatches.
  2. Register the missing filter function: add it under that exact key in the `filterFns` record provided to the table's row-model features.
  3. If the function exists locally, pass the function itself instead of a string: `globalFilterFn: myFilterFn`.
  4. Use `globalFilterFn: 'auto'` to fall back to the built-in `includesString` default.
  5. Temporarily log `table._rowModelFns.filterFns` to inspect which names are actually registered in the running instance.

Example fix

// before
const table = useTable({ globalFilterFn: 'includes_Str', filterFns: { includesString } })

// after
const table = useTable({ globalFilterFn: 'includesString', filterFns: { includesString } })
Defensive patterns

Strategy: validation

Validate before calling

const filterFns = table._rowModelFns.filterFns ?? {}
if (
  typeof globalFilterFn === 'string' &&
  globalFilterFn !== 'auto' &&
  !(globalFilterFn in filterFns)
) {
  throw new Error(`globalFilterFn '${globalFilterFn}' missing from registry: ${Object.keys(filterFns).join(', ')}`)
}

Type guard

function isRegisteredGlobalFilterFn(
  fn: unknown,
  filterFns: Record<string, unknown> | undefined,
): fn is string {
  return (
    typeof fn === 'string' &&
    (fn === 'auto' || (!!filterFns && fn in filterFns))
  )
}

Try / catch

try {
  const resolved = table.getGlobalFilterFn()
  if (!resolved) console.warn('global filtering disabled: unregistered globalFilterFn')
} catch (e) {
  console.error('failed to resolve globalFilterFn', e)
}

Prevention

When it happens

Trigger: Setting `globalFilterFn: 'myCustomFilter'` (or a built-in name like 'includesString') in useTable options when that name was never registered via the row-model features' filterFns registry; misspelling the filter name; registering filterFns on a different table instance or passing the registry lazily/after first render; renaming a filter fn in a library upgrade while the string option stays stale.

Common situations: Copying config from docs that assume a registry is pre-populated; upgrading table-core versions where built-in filter name strings changed; building filterFns dynamically and the key differs from the option string (case/typos); using a framework adapter that requires filters feature registration which was omitted.

Related errors


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