参数 'e' 隐式具有 'any' 类型 React TypeScript

lyd*_*dal 7 typescript reactjs tsx react-props

我正在尝试在 React TypeScript 文件中实现这一点:

export class MainInfo extends Component<IProps>{
  continue = e => {
    e.preventDefault();
    this.props.nextStep();
  };

  render() {
    const { values1, handleChange } = this.props
    return (
      <div>
        <Formik
          validateOnChange={true}
          validationSchema={validationSchema}
          initialValues={{ Title: '', ActivationDate: '', ExpirationDate: '', DirectManager: '', HRBP: '' }}
          onSubmit={(data) => {
            console.log(data)
          }}
Run Code Online (Sandbox Code Playgroud)

但是我收到一个参数 'e' 隐含一个 'any' 类型的 React TypeScript 错误。我应该如何解决这个问题?

编辑:我在另一个文件中有这些,我在这里使用它们作为道具

nextStep = () => {
    const { step } = this.state;
    this.setState({
      step: step + 1
    });
  };

  // Go back to prev step
  prevStep = () => {
    const { step } = this.state;
    this.setState({
      step: step - 1
    });
  };

  // Handle fields change
  handleChange = input => e => {
    this.setState({ [input]: e.target.value });
  };
Run Code Online (Sandbox Code Playgroud)

bsa*_*aka 8

在编写 TypeScript 时,您应该参考库的源代码或文档以了解它的类型是什么

例如,在 Formik 中types.tsx,我们看到

handleChange(e: React.ChangeEvent<any>): void;
Run Code Online (Sandbox Code Playgroud)

我们还可以查看 React 的类型来查看:

interface ChangeEvent<T = Element> extends SyntheticEvent<T>
Run Code Online (Sandbox Code Playgroud)

所以,像

handleChange = input => (e: React.ChangeEvent<HTMLInputElement>) => {
  this.setState({ [input]: e.target.value });
};
Run Code Online (Sandbox Code Playgroud)

...可能对你有用。

此外,如果您的 IDE 支持 TypeScript,那将有所帮助。


bru*_*ruh 5

你必须给出e一个类型。例如:

continue = (e: React.FormEvent<HTMLInputElement>) => {
  e.preventDefault()
}
Run Code Online (Sandbox Code Playgroud)

如果你不给变量和函数参数分配类型,Typescript 就会对你大喊大叫。


Dan*_*iel 5

有趣的是,如果您正在编写内联事件处理程序,您将不会看到此错误,但是为什么会在这种情况下看到它呢?

您看到该错误消息的原因是 TypeScript 中的类型推断系统及其工作原理。

TypeScript 总是试图找出应用程序中流动的不同类型的值,这就是类型推断系统的作用。

我用截图来演示一下。在下面的屏幕截图中,我将鼠标悬停在上面onChange,您会注意到 TypeScript 100% 知道该onChangeprop 的真正含义,它知道它是一个 prop,它知道我需要为其提供某种回调函数。它说,如果我决定向 提供该函数onChange,它将调用第一个参数event,其类型将是React.ChangeEvent<HTMLInputElement>

在此输入图像描述

如果我将鼠标悬停e在内联上,请注意我得到了完全相同的类型:

在此输入图像描述

但是,如果我提前定义函数,则不会应用类型推断系统。即使我提前定义函数并将其传递到onChangeprop 中,也不会应用类型推断。

当我们直接内联定义回调函数时,类型推断仅在 JSX 内部定义。

那么如何解决这个问题呢?我们如何onChange提前在示例中定义并注释事件对象的类型?

好吧,我可以将鼠标悬停onChange在上面的屏幕截图中,突出显示并复制事件类型,React.ChangeEvent<HTMLInputElement>然后在后面添加冒号event并将该类型粘贴进去。

在我的例子中它将是:

const EventComponent: React.FC = () => {
  const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    console.log(event);
  };

   return (
     <div>
       <input onChange={onChange} />
     </div>
   );
};
Run Code Online (Sandbox Code Playgroud)

这意味着,要解决您的问题,它看起来像这样:

export class MainInfo extends Component<IProps>{
  continue = (event: React.ChangeEvent<HTMLInputElement>) => {
    event.preventDefault();
    this.props.nextStep();
  };
Run Code Online (Sandbox Code Playgroud)

注意到事件类型了吗ChangeEvent?请注意,React 代码中还有其他事件,例如您可能还需要注释的悬停或拖动。只是需要注意一些事情。