{"record":{"id":"7cc16a034a9d035b","repo":"TanStack/table","slug":"filterfn-string-column-columndef-filterfn-fo","errorCode":null,"errorMessage":"filterFn '${String(column.columnDef.filterFn)}' for column '${column.id}' is not registered","messagePattern":"filterFn '(.+?)' for column '(.+?)' is not registered","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/table-core/src/features/column-filtering/columnFilteringFeature.utils.ts","lineNumber":130,"sourceCode":"  TValue extends CellData = CellData,\n>(\n  column: Column_Internal<TFeatures, TData, TValue>,\n): FilterFn<TFeatures, TData> | undefined {\n  let filterFn = null\n  const filterFns: Record<string, FilterFn<TFeatures, TData>> | undefined =\n    column.table._rowModelFns.filterFns\n  filterFn = isFunction(column.columnDef.filterFn)\n    ? column.columnDef.filterFn\n    : column.columnDef.filterFn === 'auto'\n      ? column_getAutoFilterFn(column)\n      : filterFns?.[column.columnDef.filterFn as string]\n\n  if (\n    process.env.NODE_ENV === 'development' &&\n    !filterFn &&\n    column.columnDef.filterFn !== 'auto' // the auto picker warns on its own\n  ) {\n    console.warn(\n      `filterFn '${String(column.columnDef.filterFn)}' for column '${column.id}' is not registered`,\n    )\n  }\n\n  return filterFn ?? undefined\n}\n\n/**\n * Checks whether column filtering is enabled for this accessor column.\n *\n * The column must have an accessor and filtering must be enabled by the column\n * definition, `enableColumnFilters`, and the table-wide `enableFilters` option.\n *\n * @example\n * ```ts\n * const canFilter = column_getCanFilter(column)\n * ```\n */","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/TanStack/table/blob/d01c01bedbab0ff6c2641f18b2fc9a11545d9bf6/packages/table-core/src/features/column-filtering/columnFilteringFeature.utils.ts#L112-L148","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\n{ accessorKey: 'age', filterFn: 'inNumberRange' } // never registered\n\n// after\nimport { filterFns } from '@tanstack/table-core'\nconst table = createTable({\n  /* ... */\n  filterFns: { ...filterFns }, // 'inNumberRange' now resolvable\n})","handlingStrategy":"validation","validationCode":"function assertFilterFnRegistered(filterFns: Record<string, FilterFn<any>>, name: string | FilterFn<any> | undefined) {\n  if (typeof name === 'string' && !(name in filterFns)) {\n    throw new Error(`filterFn '${name}' referenced in a columnDef is not registered`)\n  }\n}","typeGuard":"function isRegisteredFilterFn(name: string, filterFns: Record<string, FilterFn<any>>): name is string {\n  return name in filterFns\n}","tryCatchPattern":"const fn = column.getFilterFn()\nif (fn === undefined && typeof column.columnDef.filterFn === 'string') {\n  console.warn(`Column '${column.id}' filterFn '${column.columnDef.filterFn}' unregistered; filtering disabled for this column`)\n}","preventionTips":["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."],"tags":["filtering","filterfn","registration","columns"],"backgroundTag":"filter-fn-not-registered","analyzedSha":"d01c01bedbab0ff6c2641f18b2fc9a11545d9bf6","analyzedAt":"2026-08-28T21:52:44.679Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}