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
- Register the filter function under exactly the name used in columnDef.filterFn.
- Fix typos in the filterFn string so it matches a registered (or built-in) name.
- Pass the function itself instead of a string: filterFn: myFilterFn.
- 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
- Register custom filter functions in the table's filterFns option before referencing them by name.
- Use TypeScript keys: keyof typeof filterFns for columnDef.filterFn so typos fail to compile.
- Pass the function object directly (filterFn: myFn) instead of a string when possible.
- When copying column definitions between projects, audit their filterFn references against the target registry.
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
- filterFn '${filterFnName}' (auto) for column '${column.id}'
- coreColumnsFeature require an id when using an accessorFn
- coreColumnsFeature require an id when using a non-string hea
- "${key}" in deeply nested key "${accessorKey}" returned unde
- [Table] Column with id '${columnId}' does not exist.
AI-assisted analysis of TanStack/table@d01c01bedb (2026-08-28).
Data as JSON: /api/errors/7cc16a034a9d035b.
Report an issue: GitHub.