Jak używać useRef z Typescript / Formik?

Sep 02 2020

Przekazuję refwłaściwość do mojego niestandardowego FieldInput, którego używam do sprawdzania poprawności mojego formularza przez Formik. Jednak daje kilka błędów maszynopisu. Na przykład w mojej funkcji:

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

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

Pojawia się błąd w fieldRef.current that Object is possibly 'undefined'.. Myślałem, że dodanie warunku if to naprawi, ale tak się nie stało. Ponadto, kiedy przesyłam formularz, otrzymuję ostrzeżenie

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 

Podobnie w moim niestandardowym komponencie FieldInput, w którym używam ref={fieldRef}, pojawia się błąd, który:

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)

Jak mogę to naprawić?

Oto kody i skrzynki:

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

Odpowiedzi

1 zhuber Sep 07 2020 at 11:01

Jeśli przyjrzysz się obecnym typom generycznym Twojej forwardRefmetody, pierwszym parametrem jest unknown. Po prostu zmień metodę wprowadzania podpisu na

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

Typescript automatycznie rozpozna poprawny typ na podstawie forwardRefzwracanego typu metody.