Skip to content

Commit

Permalink
🐞 fix #9871 issue with error type (#9873)
Browse files Browse the repository at this point in the history
* fix #9871 issue with error type

* fix root type error

* update api extrator

* update type tests
  • Loading branch information
bluebill1049 committed Feb 5, 2023
1 parent f0f75e6 commit 494c4cf
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 6 deletions.
4 changes: 2 additions & 2 deletions reports/api-extractor.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,12 +198,12 @@ export type FieldError = {

// @public (undocumented)
export type FieldErrors<T extends FieldValues = FieldValues> = Partial<FieldValues extends IsAny<FieldValues> ? any : FieldErrorsImpl<DeepRequired<T>>> & {
root?: Record<string, GlobalError>;
root?: Record<string, GlobalError> & GlobalError;
};

// @public (undocumented)
export type FieldErrorsImpl<T extends FieldValues = FieldValues> = {
[K in keyof T]?: T[K] extends BrowserNativeObject | Blob ? FieldError : T[K] extends GlobalError ? GlobalError : T[K] extends object ? Merge<FieldError, FieldErrorsImpl<T[K]>> : FieldError;
[K in keyof T]?: T[K] extends BrowserNativeObject | Blob ? FieldError : K extends 'root' | `root.${string}` ? GlobalError : T[K] extends object ? Merge<FieldError, FieldErrorsImpl<T[K]>> : FieldError;
};

// @public (undocumented)
Expand Down
73 changes: 73 additions & 0 deletions src/__tests__/type.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,79 @@ test('should infer async default values', () => {
App;
});

test('should work for root error type', () => {
const App = () => {
const {
setError,
formState: { errors },
} = useForm();

setError('root', {
type: 'data',
message: 'test',
});
setError('root.nested', {
type: 'data',
message: 'test',
});

React.useEffect(() => {
setError('root.test', {
type: 'root.test',
});
setError('root', {
type: 'root',
});
}, [setError]);

return (
<form>
<p>{errors.root?.test?.message}</p>
<p>{errors.root?.message}</p>
</form>
);
};

App;
});

it('should worked for error with type or message keyword', () => {
type FormInputs = {
object: { id: string; type: string; message: string };
};

const App = () => {
const {
register,
handleSubmit,
formState: { errors },
} = useForm<FormInputs>({
defaultValues: {
object: {
type: 'test',
id: 'test',
},
},
});

const onSubmit = (data: FormInputs) => {
alert(JSON.stringify(data));
};

return (
<form onSubmit={handleSubmit(onSubmit)}>
<label>Id</label>
<input type="number" {...register('object.type', { min: 1 })} />
<input type="number" {...register('object.id', { min: 1 })} />
<p>{errors?.object?.id?.message}</p>
<input type="submit" />
</form>
);
};

App;
});

test('should provide correct type for validate function with useFieldArray', () => {
const App = () => {
const { control } = useForm<{
Expand Down
4 changes: 2 additions & 2 deletions src/__typetest__/errors.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import { _ } from './__fixtures__';
}
>;
} & {
root?: Record<string, GlobalError>;
root?: Record<string, GlobalError> & GlobalError;
}
>(actual);
}
Expand All @@ -54,7 +54,7 @@ import { _ } from './__fixtures__';
}
>;
} & {
root?: Record<string, GlobalError>;
root?: Record<string, GlobalError> & GlobalError;
}
>(actual);
}
Expand Down
4 changes: 2 additions & 2 deletions src/types/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export type DeepRequired<T> = T extends BrowserNativeObject | Blob
export type FieldErrorsImpl<T extends FieldValues = FieldValues> = {
[K in keyof T]?: T[K] extends BrowserNativeObject | Blob
? FieldError
: T[K] extends GlobalError
: K extends 'root' | `root.${string}`
? GlobalError
: T[K] extends object
? Merge<FieldError, FieldErrorsImpl<T[K]>>
Expand All @@ -50,7 +50,7 @@ export type FieldErrors<T extends FieldValues = FieldValues> = Partial<
? any
: FieldErrorsImpl<DeepRequired<T>>
> & {
root?: Record<string, GlobalError>;
root?: Record<string, GlobalError> & GlobalError;
};

export type InternalFieldErrors = Partial<
Expand Down

0 comments on commit 494c4cf

Please sign in to comment.