Skip to content

Commit 262c1d7

Browse files
authored
Improve support for any as form data value (#2668)
* Improve support for `any` as form data value * Update types.ts
1 parent 7cec3df commit 262c1d7

File tree

4 files changed

+50
-3
lines changed
  • packages
    • core/src
    • react/test-app/Pages/FormHelper/TypeScript
    • svelte/test-app/Pages/FormHelper/TypeScript
    • vue3/test-app/Pages/FormHelper/TypeScript

4 files changed

+50
-3
lines changed

packages/core/src/types.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,27 @@ export type FormDataType<T extends object> = {
5757
: never
5858
}
5959

60+
// Note: `0 extends 1 & T` detects `any` type to prevent infinite recursion.
6061
export type FormDataKeys<T> = T extends Function | FormDataConvertibleValue
6162
? never
6263
: T extends Array<unknown>
6364
? number extends T['length']
64-
? `${number}` | `${number}.${FormDataKeys<T[number]>}`
65+
? `${number}` | (0 extends 1 & T[number] ? never : `${number}.${FormDataKeys<T[number]>}`)
6566
:
6667
| Extract<keyof T, `${number}`>
6768
| {
68-
[Key in Extract<keyof T, `${number}`>]: `${Key & string}.${FormDataKeys<T[Key & string]> & string}`
69+
[Key in Extract<keyof T, `${number}`>]: 0 extends 1 & T[Key & string]
70+
? never
71+
: `${Key & string}.${FormDataKeys<T[Key & string]> & string}`
6972
}[Extract<keyof T, `${number}`>]
7073
: string extends keyof T
7174
? string
7275
:
7376
| Extract<keyof T, string>
7477
| {
75-
[Key in Extract<keyof T, string>]: `${Key}.${FormDataKeys<T[Key]> & string}`
78+
[Key in Extract<keyof T, string>]: 0 extends 1 & T[Key]
79+
? never
80+
: `${Key}.${FormDataKeys<T[Key]> & string}`
7681
}[Extract<keyof T, string>]
7782

7883
type PartialFormDataErrors<T> = {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// This component is used for checking the TypeScript implementation; there is no Playwright test depending on it.
2+
import { useForm } from '@inertiajs/react'
3+
4+
export default function Any() {
5+
const form = useForm<{ name: any }>({ name: null }) // eslint-disable-line @typescript-eslint/no-explicit-any
6+
7+
form.setData('name', 0)
8+
form.setData('name', 'test')
9+
form.setData('name', true)
10+
form.setData('name', null)
11+
form.setData('name', {
12+
key: 'value',
13+
})
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script lang="ts">
2+
// This component is used for checking the TypeScript implementation; there is no Playwright test depending on it.
3+
import { useForm } from '@inertiajs/svelte'
4+
5+
const form = useForm<{ name: any }>({ name: null }) // eslint-disable-line @typescript-eslint/no-explicit-any
6+
7+
$form.name = 0
8+
$form.name = 'test'
9+
$form.name = true
10+
$form.name = null
11+
$form.name = {
12+
key: 'value',
13+
}
14+
</script>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script setup lang="ts">
2+
// This component is used for checking the TypeScript implementation; there is no Playwright test depending on it.
3+
import { useForm } from '@inertiajs/vue3'
4+
5+
const form = useForm<{ name: any }>({ name: null }) // eslint-disable-line @typescript-eslint/no-explicit-any
6+
7+
form.name = 0
8+
form.name = 'test'
9+
form.name = true
10+
form.name = null
11+
form.name = {
12+
key: 'value',
13+
}
14+
</script>

0 commit comments

Comments
 (0)