Skip to content

Commit 7844175

Browse files
committed
fix: fix types useForm typehinting issue
1 parent a223f5b commit 7844175

File tree

8 files changed

+55
-26
lines changed

8 files changed

+55
-26
lines changed

packages/react/src/useForm.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import useRemember from './useRemember'
66
type setDataByObject<TForm> = (data: TForm) => void
77
type setDataByMethod<TForm> = (data: (previousData: TForm) => TForm) => void
88
type setDataByKeyValuePair<TForm> = <K extends keyof TForm>(key: K, value: TForm[K]) => void
9-
type FormDataType = Record<string, FormDataConvertible>
9+
type FormDataType<T> = Record<keyof T, FormDataConvertible>
1010
type FormOptions = Omit<VisitOptions, 'data'>
1111

12-
export interface InertiaFormProps<TForm extends FormDataType> {
12+
export interface InertiaFormProps<TForm extends FormDataType<TForm>> {
1313
data: TForm
1414
isDirty: boolean
1515
errors: Partial<Record<keyof TForm, string>>
@@ -35,12 +35,12 @@ export interface InertiaFormProps<TForm extends FormDataType> {
3535
delete: (url: string, options?: Partial<FormOptions>) => void
3636
cancel: () => void
3737
}
38-
export default function useForm<TForm extends FormDataType>(initialValues?: TForm): InertiaFormProps<TForm>
39-
export default function useForm<TForm extends FormDataType>(
38+
export default function useForm<TForm extends FormDataType<TForm>>(initialValues?: TForm): InertiaFormProps<TForm>
39+
export default function useForm<TForm extends FormDataType<TForm>>(
4040
rememberKey: string,
4141
initialValues?: TForm,
4242
): InertiaFormProps<TForm>
43-
export default function useForm<TForm extends FormDataType>(
43+
export default function useForm<TForm extends FormDataType<TForm>>(
4444
rememberKeyOrInitialValues?: string | TForm,
4545
maybeInitialValues?: TForm,
4646
): InertiaFormProps<TForm> {

packages/react/test-app/Pages/FormHelper/Data.jsx packages/react/test-app/Pages/FormHelper/Data.tsx

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1+
12
import { useForm, usePage } from '@inertiajs/react'
23

4+
interface InputData {
5+
name: string
6+
handle: string
7+
remember: boolean
8+
}
9+
310
export default (props) => {
4-
const form = useForm({
11+
const form = useForm<InputData>({
512
name: 'foo',
613
handle: 'example',
714
remember: false,

packages/react/test-app/app.jsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ import { createRoot } from 'react-dom/client'
44
createInertiaApp({
55
page: window.initialPage,
66
resolve: (name) => {
7-
const pages = import.meta.glob('./Pages/**/*.jsx', { eager: true })
8-
return pages[`./Pages/${name}.jsx`]
7+
if (name === 'FormHelper/Data') {
8+
return pages[`./Pages/${name}.tsx`]
9+
}
10+
11+
const pages = import.meta.glob('./Pages/**/*.tsx', { eager: true })
12+
return pages[`./Pages/${name}.tsx`]
913
},
1014
setup({ el, App, props }) {
1115
createRoot(el).render(<App {...props} />)

packages/react/test-app/tsconfig.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"compilerOptions": {
3+
"jsx": "react-jsx"
4+
},
5+
}

packages/svelte/src/useForm.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ import cloneDeep from 'lodash/cloneDeep'
1515
import isEqual from 'lodash/isEqual'
1616
import { writable, type Writable } from 'svelte/store'
1717

18-
type FormDataType = Record<string, FormDataConvertible>
18+
type FormDataType<T> = Record<keyof T, FormDataConvertible>
1919
type FormOptions = Omit<VisitOptions, 'data'>
2020

21-
export interface InertiaFormProps<TForm extends FormDataType> {
21+
export interface InertiaFormProps<TForm extends FormDataType<TForm>> {
2222
isDirty: boolean
2323
errors: Partial<Record<keyof TForm, string>>
2424
hasErrors: boolean
@@ -46,14 +46,14 @@ export interface InertiaFormProps<TForm extends FormDataType> {
4646
cancel(): void
4747
}
4848

49-
export type InertiaForm<TForm extends FormDataType> = InertiaFormProps<TForm> & TForm
49+
export type InertiaForm<TForm extends FormDataType<TForm>> = InertiaFormProps<TForm> & TForm
5050

51-
export default function useForm<TForm extends FormDataType>(data: TForm | (() => TForm)): Writable<InertiaForm<TForm>>
52-
export default function useForm<TForm extends FormDataType>(
51+
export default function useForm<TForm extends FormDataType<TForm>>(data: TForm | (() => TForm)): Writable<InertiaForm<TForm>>
52+
export default function useForm<TForm extends FormDataType<TForm>>(
5353
rememberKey: string,
5454
data: TForm | (() => TForm),
5555
): Writable<InertiaForm<TForm>>
56-
export default function useForm<TForm extends FormDataType>(
56+
export default function useForm<TForm extends FormDataType<TForm>>(
5757
rememberKeyOrData: string | TForm | (() => TForm),
5858
maybeData?: TForm | (() => TForm),
5959
): Writable<InertiaForm<TForm>> {
@@ -86,7 +86,7 @@ export default function useForm<TForm extends FormDataType>(
8686
return Object.keys(data).reduce((carry, key) => {
8787
carry[key] = this[key]
8888
return carry
89-
}, {} as FormDataType) as TForm
89+
}, {} as FormDataType<TForm>) as TForm
9090
},
9191
transform(callback) {
9292
transform = callback
@@ -114,7 +114,7 @@ export default function useForm<TForm extends FormDataType>(
114114
.reduce((carry, key) => {
115115
carry[key] = clonedData[key]
116116
return carry
117-
}, {} as FormDataType) as TForm,
117+
}, {} as FormDataType<TForm>) as TForm,
118118
)
119119
}
120120

packages/svelte/test-app/Pages/FormHelper/Data.svelte

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1-
<script>
1+
<script lang="ts">
22
import { page, useForm } from '@inertiajs/svelte'
33
4-
const form = useForm({
4+
5+
interface InputData {
6+
name: string
7+
handle: string
8+
remember: boolean
9+
}
10+
11+
const form = useForm<InputData>({
512
name: 'foo',
613
handle: 'example',
714
remember: false,

packages/vue3/src/useForm.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import cloneDeep from 'lodash.clonedeep'
33
import isEqual from 'lodash.isequal'
44
import { reactive, watch } from 'vue'
55

6-
type FormDataType = Record<string, FormDataConvertible>
6+
type FormDataType<T> = { [K in keyof T]: FormDataConvertible };
77
type FormOptions = Omit<VisitOptions, 'data'>
88

9-
export interface InertiaFormProps<TForm extends FormDataType> {
9+
export interface InertiaFormProps<TForm extends FormDataType<TForm>> {
1010
isDirty: boolean
1111
errors: Partial<Record<keyof TForm, string>>
1212
hasErrors: boolean
@@ -32,14 +32,14 @@ export interface InertiaFormProps<TForm extends FormDataType> {
3232
cancel(): void
3333
}
3434

35-
export type InertiaForm<TForm extends FormDataType> = TForm & InertiaFormProps<TForm>
35+
export type InertiaForm<TForm extends FormDataType<TForm>> = TForm & InertiaFormProps<TForm>
3636

37-
export default function useForm<TForm extends FormDataType>(data: TForm | (() => TForm)): InertiaForm<TForm>
38-
export default function useForm<TForm extends FormDataType>(
37+
export default function useForm<TForm extends FormDataType<TForm>>(data: TForm | (() => TForm)): InertiaForm<TForm>
38+
export default function useForm<TForm extends FormDataType<TForm>>(
3939
rememberKey: string,
4040
data: TForm | (() => TForm),
4141
): InertiaForm<TForm>
42-
export default function useForm<TForm extends FormDataType>(
42+
export default function useForm<TForm extends FormDataType<TForm>>(
4343
rememberKeyOrData: string | TForm | (() => TForm),
4444
maybeData?: TForm | (() => TForm),
4545
): InertiaForm<TForm> {

packages/vue3/test-app/Pages/Remember/FormHelper/Default.vue

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
<script setup>
1+
<script setup lang="ts">
22
import { Link, useForm } from '@inertiajs/vue3'
33
import { ref } from 'vue'
44
55
const untracked = ref('')
66
7-
const form = useForm({
7+
interface InputData {
8+
name: string
9+
handle: string
10+
remember: boolean
11+
}
12+
13+
const form = useForm<InputData>({
814
name: 'foo',
915
handle: 'example',
1016
remember: false,

0 commit comments

Comments
 (0)