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
- Check the exact string passed to `globalFilterFn` against the keys of the object passed as the filterFns registry; fix typos/case mismatches.
- Register the missing filter function: add it under that exact key in the `filterFns` record provided to the table's row-model features.
- If the function exists locally, pass the function itself instead of a string: `globalFilterFn: myFilterFn`.
- Use `globalFilterFn: 'auto'` to fall back to the built-in `includesString` default.
- 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
- Type the option with a keyof union of your registry keys so typos fail at compile time.
- Keep filterFns and globalFilterFn strings co-located in one config module.
- Prefer passing filter functions directly over string refs.
- Run dev builds during CI; this warning only emits when NODE_ENV=development.
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
- aggregationFn '${String(ref)}' for column '${column.id}' is
- ${message}
- aggregationFn at index ${i} for column '${column.id}' needs
- aggregationFn id '${id}' for column '${column.id}' is duplic
- [table-worker] ${message}
AI-assisted analysis of TanStack/table@d01c01bedb (2026-08-28).
Data as JSON: /api/errors/fdd068f076cd66c7.
Report an issue: GitHub.