type FieldError = string;
type FieldErrors = {
__errors?: FieldError[];
};
type FieldValidation = FieldErrors & {
addError: (message: string) => void;
};
type FormValidation = Record<string, FieldValidation | Record<string, FieldValidation>>;
function isObject(value: Record<string, unknown> | undefined): value is Record<string, unknown> {
return typeof value === 'object' && value !== null && !Array.isArray(value);
}
async function recursive(root: Record<string, unknown>, current: Record<string, unknown>): Promise<FormValidation> {
const formValidation: FormValidation = {};
for (const [key, value] of Object.entries(current)) {
if (isObject(current)) {
formValidation[key] = await recursive(root, current);
}
}
return formValidation;
}
In the example above , I have FormValidation is currently defined as
type FormValidation = Record<string, FieldValidation | Record<string, FieldValidation>>;
I think I need to somehow narrow the type or let tsc know whether I am dealing with a FiedValdiation or Record<string, FieldValidation on this line
formValidation[key] = await validate(formData, path, value);
The error I get here is
type 'FormValidation' is not assignable to type 'FieldValidation | Record<string, FieldValidation>'.
Type 'FormValidation' is not assignable to type 'FieldValidation'.
Property 'addError' is missing in type 'FormValidation' but required in type '{ addError: (message: string) => void; }'.ts(2322)
index.d.ts(108, 5): 'addError' is declared here.