Я использую Formik, в котором есть этот тип:
type FormikErrors<Values> = {
[K in keyof Values]?: Values[K] extends object
? FormikErrors<Values[K]>
: string
};
Затем есть функция проверки, которая в основном выглядит как validate<Values>(v: Values) => FormikErrors<Values>
. Идея состоит в том, что ключи FormikErrors совпадают с ключами Values и сопоставляются со строковым сообщением об ошибке ИЛИ рекурсивным объектом FormikErrors, если это поле представлено вложенным объектом.
Я пытаюсь написать общую функцию для проверки обязательных полей. Он должен работать только с плоскими значениями.
export function validateRequired<T, K extends keyof T>(values : T, names: K[]) : FormikErrors<T> {
let errors : FormikErrors<T> = {};
names.forEach((name) => {
if (!values[name]) {
errors[name] = 'This field is required';
}
});
return errors;
}
Хотя это ошибка:
Type error: Type '"This field is required"' is not assignable to type '(T[K] extends object ? FormikErrors<T[K]> : string) | undefined'. TS2322
Поскольку значения объекта, возвращаемые validateRequired, всегда являются строками, а не вложенными значениями FormikValues. Есть ли способ указать, что значения всегда будут скалярами, чтобы можно было ввести проверку?