Skip to content

Commit 411dd94

Browse files
author
Sebastian Hoffmann
committed
feat(types): make types on functions extend off the base classes generic instead of equal to them
Basically, this fails: ```ts type Test<T> = { defaultValues: T fun: (props: { value: T }) => {} } const t: Test<{ firstName: string }> = {} as Test<{ firstName: string, lastName: string }> ``` While this works: ```ts type Test2<T> = { defaultValues: T, fun: <TF extends T = T>(props: { value: TF }) => void } // ist fine, the actual type has all that was asked for and then some const t2: Test2<{ firstName: string }> = {} as Test2<{ firstName: string, lastName: string }> ``` and still ensures that `firstName` is included on t2. The main idea is unless `props.value` only extends T, TypeScript checks the equality both ways. If it does extend T, the checking becomes unidirectional
1 parent fed72ed commit 411dd94

File tree

1 file changed

+79
-65
lines changed

1 file changed

+79
-65
lines changed

packages/form-core/src/FormApi.ts

+79-65
Original file line numberDiff line numberDiff line change
@@ -193,40 +193,43 @@ export interface FormValidators<
193193
*/
194194
export interface FormTransform<
195195
TFormData,
196-
TOnMount extends undefined | FormValidateOrFn<TFormData>,
197-
TOnChange extends undefined | FormValidateOrFn<TFormData>,
198-
TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
199-
TOnBlur extends undefined | FormValidateOrFn<TFormData>,
200-
TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
201-
TOnSubmit extends undefined | FormValidateOrFn<TFormData>,
202-
TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
203-
TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,
204196
TSubmitMeta = never,
205197
> {
206-
fn: (
198+
fn: <
199+
TFFormData extends TFormData,
200+
TFOnMount extends undefined | FormValidateOrFn<TFFormData>,
201+
TFOnChange extends undefined | FormValidateOrFn<TFFormData>,
202+
TFOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
203+
TFOnBlur extends undefined | FormValidateOrFn<TFFormData>,
204+
TFOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
205+
TFOnSubmit extends undefined | FormValidateOrFn<TFFormData>,
206+
TFOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
207+
TFOnServer extends undefined | FormValidateOrFn<TFFormData>,
208+
TFSubmitMeta extends TSubmitMeta
209+
>(
207210
formBase: FormApi<
208-
TFormData,
209-
TOnMount,
210-
TOnChange,
211-
TOnChangeAsync,
212-
TOnBlur,
213-
TOnBlurAsync,
214-
TOnSubmit,
215-
TOnSubmitAsync,
216-
TOnServer,
217-
TSubmitMeta
211+
TFFormData,
212+
TFOnMount,
213+
TFOnChange,
214+
TFOnChangeAsync,
215+
TFOnBlur,
216+
TFOnBlurAsync,
217+
TFOnSubmit,
218+
TFOnSubmitAsync,
219+
TFOnServer,
220+
TFSubmitMeta
218221
>,
219222
) => FormApi<
220-
TFormData,
221-
TOnMount,
222-
TOnChange,
223-
TOnChangeAsync,
224-
TOnBlur,
225-
TOnBlurAsync,
226-
TOnSubmit,
227-
TOnSubmitAsync,
228-
TOnServer,
229-
TSubmitMeta
223+
TFFormData,
224+
TFOnMount,
225+
TFOnChange,
226+
TFOnChangeAsync,
227+
TFOnBlur,
228+
TFOnBlurAsync,
229+
TFOnSubmit,
230+
TFOnSubmitAsync,
231+
TFOnServer,
232+
TFSubmitMeta
230233
>
231234
deps: unknown[]
232235
}
@@ -296,52 +299,63 @@ export interface FormOptions<
296299
/**
297300
* A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise<any>`
298301
*/
299-
onSubmit?: (props: {
300-
value: TFormData
302+
onSubmit?: <
303+
TFFormData extends TFormData,
304+
TFOnMount extends undefined | FormValidateOrFn<TFFormData>,
305+
TFOnChange extends undefined | FormValidateOrFn<TFFormData>,
306+
TFOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
307+
TFOnBlur extends undefined | FormValidateOrFn<TFFormData>,
308+
TFOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
309+
TFOnSubmit extends undefined | FormValidateOrFn<TFFormData>,
310+
TFOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
311+
TFOnServer extends undefined | FormValidateOrFn<TFFormData>,
312+
TFSubmitMeta extends TSubmitMeta
313+
>(props: {
314+
value: TFFormData
301315
formApi: FormApi<
302-
TFormData,
303-
TOnMount,
304-
TOnChange,
305-
TOnChangeAsync,
306-
TOnBlur,
307-
TOnBlurAsync,
308-
TOnSubmit,
309-
TOnSubmitAsync,
310-
TOnServer,
311-
TSubmitMeta
316+
TFFormData,
317+
TFOnMount,
318+
TFOnChange,
319+
TFOnChangeAsync,
320+
TFOnBlur,
321+
TFOnBlurAsync,
322+
TFOnSubmit,
323+
TFOnSubmitAsync,
324+
TFOnServer,
325+
TFSubmitMeta
312326
>
313327
meta: TSubmitMeta
314328
}) => any | Promise<any>
315329
/**
316330
* Specify an action for scenarios where the user tries to submit an invalid form.
317331
*/
318-
onSubmitInvalid?: (props: {
319-
value: TFormData
332+
onSubmitInvalid?: <
333+
TFFormData extends TFormData,
334+
TFOnMount extends undefined | FormValidateOrFn<TFFormData>,
335+
TFOnChange extends undefined | FormValidateOrFn<TFFormData>,
336+
TFOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
337+
TFOnBlur extends undefined | FormValidateOrFn<TFFormData>,
338+
TFOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
339+
TFOnSubmit extends undefined | FormValidateOrFn<TFFormData>,
340+
TFOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
341+
TFOnServer extends undefined | FormValidateOrFn<TFFormData>,
342+
TFSubmitMeta extends TSubmitMeta
343+
>(props: {
344+
value: TFFormData
320345
formApi: FormApi<
321-
TFormData,
322-
TOnMount,
323-
TOnChange,
324-
TOnChangeAsync,
325-
TOnBlur,
326-
TOnBlurAsync,
327-
TOnSubmit,
328-
TOnSubmitAsync,
329-
TOnServer,
330-
TSubmitMeta
346+
TFFormData,
347+
TFOnMount,
348+
TFOnChange,
349+
TFOnChangeAsync,
350+
TFOnBlur,
351+
TFOnBlurAsync,
352+
TFOnSubmit,
353+
TFOnSubmitAsync,
354+
TFOnServer,
355+
TFSubmitMeta
331356
>
332357
}) => void
333-
transform?: FormTransform<
334-
NoInfer<TFormData>,
335-
NoInfer<TOnMount>,
336-
NoInfer<TOnChange>,
337-
NoInfer<TOnChangeAsync>,
338-
NoInfer<TOnBlur>,
339-
NoInfer<TOnBlurAsync>,
340-
NoInfer<TOnSubmit>,
341-
NoInfer<TOnSubmitAsync>,
342-
NoInfer<TOnServer>,
343-
NoInfer<TSubmitMeta>
344-
>
358+
transform?: FormTransform<NoInfer<TFormData>>
345359
}
346360

347361
/**

0 commit comments

Comments
 (0)