You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Formik自定义组件handleChange/handleBlur的TypeScript类型兼容问题求解

解决Formik handleChange/handleBlur与自定义组件的TypeScript类型冲突问题

这个问题的核心是Formik的内置处理函数类型和你的自定义FieldInput组件的props类型不匹配,但我们完全不需要用any或者强行修改参数类型,只需要调整两个地方就能完美解决:

1. 修正FieldInput的Props类型定义

首先,在FieldInput.tsx里,我们应该让handleChange和handleBlur的类型兼容Formik的处理函数,而不是自定义成(e: string) => undefined。Formik已经提供了现成的类型可以直接导入使用:

import React from 'react';
import { TextInput, View } from 'react-native';
import { FieldChangeHandler, FieldBlurHandler } from 'formik';

// 重新定义FieldInput的props类型
interface FieldInputProps {
  handleChange: FieldChangeHandler<string>;
  handleBlur: FieldBlurHandler<string>;
  value: string;
  fieldType: string;
  icon: string;
  placeholderText: string;
}

export const FieldInput = ({ 
  handleChange, 
  handleBlur, 
  value, 
  placeholderText 
}: FieldInputProps) => {
  return (
    <View>
      {/* React Native的TextInput用onChangeText传递字符串,正好匹配FieldChangeHandler */}
      <TextInput
        value={value}
        onChangeText={handleChange}
        onBlur={handleBlur}
        placeholder={placeholderText}
        keyboardType="phone-pad"
      />
      {/* 你的icon组件... */}
    </View>
  );
};

FieldChangeHandler<string>和FieldBlurHandler<string>是Formik专门为字段处理定义的类型,它们既支持接收ChangeEvent对象,也支持直接接收字符串值,完美适配React Native的TextInput.onChangeText场景。

2. 在父组件中传递字段绑定后的处理函数

Formik的handleChange是一个重载函数:

  • 直接调用handleChange(e)会处理整个表单的变更事件
  • 调用handleChange('phoneNumber')会返回一个专门绑定到phoneNumber字段的处理函数,这个函数的类型正好和我们上面定义的FieldChangeHandler<string>匹配。

所以父组件里的用法要改成这样:

<Formik 
  initialValues={initialValues} 
  onSubmit={handleSubmitForm} 
  validationSchema={validationSchema}
>
  {({ handleChange, handleBlur, handleSubmit, values }) => (
    <View style={styles.searchFieldContainer}>
      <View style={styles.form}>
        <FieldInput 
          // 这里要传入绑定了字段名的处理函数
          handleChange={handleChange('phoneNumber')} 
          handleBlur={handleBlur('phoneNumber')} 
          value={values.phoneNumber} 
          fieldType="phoneNumber" 
          icon='phone' 
          placeholderText='49152901820' 
        />
        <ErrorMessage name="phoneNumber" render={(msg) => (
          <Text style={styles.errorText}>{msg}</Text>
        )} />
      </View>
      <View style={styles.buttonContainer}>
        <Button onPress={handleSubmit}> Search </Button>
      </View>
    </View>
  )}
</Formik>

为什么这样能解决问题?

之前的错误是因为你直接传递了handleChange本身,它的类型是接收ChangeEvent<any>的,而你的FieldInput期望的是接收字符串的函数。当你用handleChange('phoneNumber')时,返回的函数已经和指定字段绑定,并且支持接收字符串作为参数(这正是React Native TextInput传递的内容),TypeScript就能正确识别类型,不会再报错了。

内容的提问来源于stack exchange,提问作者user12541823

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:22:34