Wie verwende ich useRef mit Typescript / Formik?

Sep 02 2020

Ich übergebe eine refEigenschaft an meinen benutzerdefinierten FieldInput, den ich für die Formik-Validierung meines Formulars verwende. Es gibt jedoch einige Typescript-Fehler. Zum Beispiel in meiner Funktion:

    const handleSubmitForm = (
    values: FormValues,
    helpers: FormikHelpers<FormValues>,
  ) => {

    setShowFlatList(true);
    Keyboard.dismiss();
    helpers.resetForm();
    if (fieldRef && fieldRef.current){
          fieldRef.current.blur();}
    helpers.resetForm();
  };

Ich bekomme einen Fehler auf fieldRef.current, dass Object is possibly 'undefined'.. Ich dachte, das Hinzufügen der if-Bedingung würde das Problem beheben, aber das tat es nicht. Wenn ich das Formular abschicke, erhalte ich außerdem eine Warnung

Warning: An unhandled error was caught from submitForm()
Error: "fieldRef.current.blur is not a function. (In 'fieldRef.current.blur()', 'fieldRef.current.blur' is undefined)" in handleSubmitForm 

Ebenso erhalte ich in meiner benutzerdefinierten FieldInput-Komponente, die ich verwende ref={fieldRef}, die folgende Fehlermeldung:

Type '{ ref: MutableRefObject<undefined>; setFieldTouched: (field: string, isTouched?: boolean | undefined, shouldValidate?: boolean | undefined) => void; handleChange: { ...; }; ... 4 more ...; placeholderText: string; }' is not assignable to type 'IntrinsicAttributes & FieldInputProps & { children?: ReactNode; }'.
  Property 'ref' does not exist on type 'IntrinsicAttributes & FieldInputProps & { children?: ReactNode; }'.ts(2322)

Wie kann ich diese beheben?

Hier ist eine Codesandbox:

https://snack.expo.io/@nhammad/jealous-beef-jerky-fix

Antworten

1 zhuber Sep 07 2020 at 11:01

Wenn Sie sich die aktuellen generischen Typen Ihrer forwardRefMethode ansehen , lautet der erste Parameter unknown. Ändern Sie einfach Ihre Signatur-Eingabemethode in

export const FieldInput = React.forwardRef<Input, FieldInputProps>(...)

Typescript löst den korrekten Typ automatisch basierend auf dem forwardRefRückgabetyp der Methode auf.