Skip to content

fix: restore correct RemoteFormFields typing for nullable array fields#15723

Merged
elliott-with-the-longest-name-on-github merged 1 commit into
mainfrom
elliott/nullable-array-fields-form
Apr 18, 2026
Merged

fix: restore correct RemoteFormFields typing for nullable array fields#15723
elliott-with-the-longest-name-on-github merged 1 commit into
mainfrom
elliott/nullable-array-fields-form

Conversation

@elliott-with-the-longest-name-on-github

Copy link
Copy Markdown
Contributor

Closes #15722

Problem

Accessing .as(...) on a remote form field whose schema input type includes undefined (e.g. Zod's z.something().array().default([]), which produces string[] | undefined for StandardSchemaV1.InferInput) no longer typechecks.

const schema = z.object({
  policyAvailableAccessTypes: z.enum([...]).array().default(['unlimited'])
});
// `.as()` is missing from the type, even though it works at runtime
form.fields.policyAvailableAccessTypes.as('checkbox', 'unlimited');
Cause
Regression from #15687, which switched the array-detection branches of RemoteFormFields<T> from distributive (T extends string[] | File[]) to non-distributive ([T] extends [string[] | File[]]) to stop distribution over object unions.
With the new non-distributive check, [string[] | undefined] does not extend [string[] | File[]] (nor [Array<infer U>]), so nullable array types fall through to the generic object-property branch, which doesn't expose .as(...).
Fix
Wrap T in NonNullable<T> on the array-detection branches, consistent with how the primitive branch right above it already works:
: [NonNullable<T>] extends [string[] | File[]]
    ? RemoteFormField<NonNullable<T>> & { [K in number]: RemoteFormField<NonNullable<T>[number]> }
    : [NonNullable<T>] extends [Array<infer U>]
        ? RemoteFormFieldContainer<NonNullable<T>> & { [K in number]: RemoteFormFields<U> }
        : // object-union branch unchanged — still uses KeysOfUnion / ValueOfUnionKey on raw T
The final object-union branch is unchanged, so #15687's fix for discriminated-union objects is preserved.

@changeset-bot

changeset-bot Bot commented Apr 17, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3acf83e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@sveltejs/kit Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@svelte-docs-bot

Copy link
Copy Markdown

@Conduitry Conduitry changed the title fix: restor correct RemoteFormFields typing for nullable array fields fix: restore correct RemoteFormFields typing for nullable array fields Apr 17, 2026
@elliott-with-the-longest-name-on-github elliott-with-the-longest-name-on-github merged commit 394470c into main Apr 18, 2026
29 checks passed
@elliott-with-the-longest-name-on-github elliott-with-the-longest-name-on-github deleted the elliott/nullable-array-fields-form branch April 18, 2026 14:04
This was referenced Apr 13, 2026
elliott-with-the-longest-name-on-github pushed a commit that referenced this pull request Apr 23, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @sveltejs/kit@2.58.0

### Minor Changes

- breaking: require `limit` in `requested` (as originally intended)
([#15739](#15739))


- feat: `RemoteQueryFunction` gains an optional third generic parameter
`Validated` (defaulting to `Input`) that represents the argument type
after schema validation/transformation
([#15739](#15739))


- breaking: `requested` now yields `{ arg, query }` entries instead of
the validated argument
([#15739](#15739))

### Patch Changes

- fix: allow `query().current`, `.error`, `.loading`, and `.ready` to
work in non-reactive contexts
([#15699](#15699))


- fix: prevent `deep_set` crash on nullish nested values
([#15600](#15600))


- fix: restore correct `RemoteFormFields` typing for nullable array
fields (e.g. when a schema uses `.default([])`), so `.as('checkbox')`
and friends work again
([#15723](#15723))


- fix: don't warn about removed SSI comments in `transformPageChunk`
([#15695](#15695))

Server-side include (SSI) directives like `<!--#include virtual="..."
-->` are HTML comments that are replaced by servers such as nginx.
Previously, removing them in `transformPageChunk` would trigger a false
positive warning about breaking Svelte's hydration. Since SSI comments
always start with `<!--#` and Svelte's hydration comments never do, they
can be safely excluded from the check.

- Change enhance function return type from void to MaybePromise<void>.
([#15710](#15710))


- fix: throw an error when `resolve` is called with an external URL
([#15733](#15733))


- fix: avoid FOUC for CSR-only pages by loading styles and fonts before
CSR starts ([#15718](#15718))


- fix: reset form result on redirect
([#15724](#15724))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Remote forms][regression] Zod4 enum array does not type correctly when using .as('checkbox')

2 participants