Skip to content

[v2] FieldWithValue<T> erases field.name to any instead of string #2465

Closed

Description

@pedro757

Describe the bug

In 2.0.0-alpha.3, the recommended reusable-field prop type FieldWithValue<T> erases field.name to any, rather than widening the concrete field-path literal to string.

I understand that the helper intentionally erases the specific name, error, and owning form types. This report is not asking it to preserve a particular path such as "enabled"; it is about retaining the basic string guarantee while accepting any field path.

For example, a reusable checkbox/switch accepting FieldWithValue<boolean> gets correctly typed field.value and field.handleChange, but field.name.toFixed() and assigning field.name to a number are both accepted. This also exposes any to type-aware linting when forwarding the name to a native input.

Minimal reproducible example / steps

This reproduces in a standalone directory with the actual package name, without an npm alias, Next.js, a UI library, or the consuming application's configuration.

Install:

pnpm init
pnpm add @tanstack/react-form@2.0.0-alpha.3 react@19.3.1
pnpm add -D typescript@7.0.2 @types/react@19.3.0

Save as expected.ts:

import type { FieldWithValue } from '@tanstack/react-form'

declare const field: FieldWithValue<boolean>

// @ts-expect-error A field path is not a number.
const invalidNumber: number = field.name

// @ts-expect-error A field path does not have Number.prototype.toFixed.
field.name.toFixed()

// @ts-expect-error A boolean field cannot be updated to a string.
field.handleChange('not a boolean')

Run:

pnpm exec tsc --ignoreConfig --noEmit --strict --skipLibCheck --module NodeNext --target ES2022 expected.ts

Actual result:

expected.ts(5,1): error TS2578: Unused '@ts-expect-error' directive.
expected.ts(8,1): error TS2578: Unused '@ts-expect-error' directive.

The third directive is correctly consumed, confirming value typing is preserved. Removing the first two directives makes the entire file compile successfully, even though the numeric operations are invalid for a field-path string.

I also verified in a separate TSX reproduction that useForm({ defaultValues: { enabled: false } }) supplies the literal "enabled" to the <form.Field name="enabled"> render prop. Passing that field into a component accepting FieldWithValue<boolean> is where the name becomes any; wrapping the reusable component with getFormHookHelpers().fieldComponent.loose is not necessary to trigger the issue.

Expected behavior

FieldWithValue<T>['name'] should be string, while the value/update types remain T and the component can still accept fields at arbitrary paths. The first two directives above should be consumed rather than reported as unused.

Suspected cause / possible direction

The published alias is:

type FieldWithValue<TFieldValue> = FieldApi<any, TFieldValue, any, any, any>

FieldApi exposes get name(): TFieldName, so the first any directly becomes the property's type. The same definition is still present on the alpha branch at 2b4fc5c.

Could that first argument be string instead? I tested a local candidate alias FieldApi<string, TFieldValue, any, any, any> without modifying the installed library. It rejects both invalid name operations, preserves boolean update checking, accepts the concrete field from the render prop, and is accepted by both fieldComponent.strict and fieldComponent.loose in the minimal TSX reproduction. This is a candidate direction, not a claim that the full upstream suite has been checked.

Frequency

Every time.

Platform

Linux; compile-time TypeScript issue, no browser required.

TanStack Form adapter

react-form (the alias is defined in form-core).

TanStack Form version

@tanstack/react-form and its @tanstack/form-core dependency: 2.0.0-alpha.3 (current npm alpha tag when checked).

TypeScript version

7.0.2. Standalone reproduction uses React 19.3.1 and @types/react 19.3.0.

Activity

  1. Priyeshshrivastav commented on Nov 4, 2026

    @Priyeshshrivastav

    Hi @pedro757!

    I'd like to work on this issue and submit a fix.

    I reviewed the proposed approach and confirmed that the first generic parameter of FieldApi represents TFieldName.

    I'd like to update FieldWithValue<TFieldValue> to use string for the field name while preserving the existing value typing, and add appropriate type-level tests.

    Is anyone already working on this? I'd be happy to take it up.

    Thanks!

  2. pedro757 commented on Nov 4, 2026

    @pedro757
    Author
  3. Priyeshshrivastav commented on Nov 5, 2026

    @Priyeshshrivastav

    Thanks for the approval, @pedro757! I'll start working on this, add the required type-level regression tests, and submit a PR once everything is verified.

  4. added
    type: bugThis is a bug in behaviour.
    v2This issue affects v2 as well.
    scope: coreThis issue affects the core package, meaning any adapter is also affected by it.
    area: typesThis issue affects the types of the library.
    on Nov 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: typesThis issue affects the types of the library.scope: coreThis issue affects the core package, meaning any adapter is also affected by it.type: bugThis is a bug in behaviour.v2This issue affects v2 as well.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions