Me gustaría hacer que mi gancho personalizado sea reutilizable tanto como pueda.
Me gustaría pasar el tipo genérico (porque para diferentes formularios tendré diferentes campos de errores) a mis const errors: Y = {}; que ahora está vacío, pero se puede devolver como objeto con errores de validación.
En la línea 4 const errors: Y = {}; Recibí un error:
El tipo '{}' no se puede asignar al tipo 'Y'. Se podría crear una instancia de 'Y' con un tipo arbitrario que podría no estar relacionado con '{}'.ts(2322)
validar.ts:
export default function validate<T extends Record<string, string>, Y>( values: T ): Y { const errors: Y = {}; if (!values.title) { errors.title = "Title is required"; } return errors; } Lugar donde uso el método validate :
setErrors(validate<T, Y>(state)); function useFormState<T extends Record<string, string>, Y>( initialValue: T, initialErrors: Y ) { const [state, dispatch] = useReducer( (prevState: T, { name, value }: InputChangeEvent["target"]) => ({ ...prevState, [name]: value }), initialValue ); const [errors, setErrors] = useState<Y>(initialErrors); const handleSubmit = (evt: FormEvent) => { evt.preventDefault(); setErrors(validate<T, Y>(state)); }; return [state, errors, handleSubmit] as const; } export default useFormState; Traté de pasar un tipo diferente a este método const errors: ErrorValues = {}; Pero luego tengo dos problemas diferentes:
setErrors(validate(state)); Recibí otro error:El argumento de tipo 'ErrorValues' no se puede asignar al parámetro de tipo 'SetStateAction'. El tipo 'ErrorValues' no se puede asignar al tipo '(prevState: Y) => Y'. El tipo 'ErrorValues' no proporciona ninguna coincidencia para la firma '(prevState: Y): Y'.ts(2345)
¿Puedes probar esto tal vez? Pasé este código temporalmente en su sandbox, parece estar bien
export default function validate< T extends Record<string, string>, Y extends Record<string, unkown> >(values: T): Y { let errors: Y = {} as Y; if (!values.title) { errors = { ...errors, title: "Title is required ", }; } return errors; }