网站搜索

javascript - 参数 'data' 隐式具有 'any' 类型.ts(7006) React 钩子


我真的完全不明白为什么“data”会出现 7006 错误的下划线,但在测试环境中,在 React Hooks 的主页(https://react-hook-form.com/get-started#Quickstart)上,它却能正常工作。

我是不是缺少某个依赖,或者需要另一个文件或导入某些东西?

我在另一个区域也有这个问题。

import React from "react";
import ReactDOM from "react-dom";
import { useForm } from "react-hook-form";

import "./styles.css";

function App() {
  const { register, handleSubmit, watch, errors } = useForm();
  const onSubmit = data => {
    console.log(data);
  }; // your form submit function which will invoke after successful validation

  console.log(watch("example")); // you can watch individual input by pass the name of the input

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <label>Example</label>
      <input name="example" defaultValue="test" ref={register} />
      <label>ExampleRequired</label>
      <input
        name="exampleRequired"
        ref={register({ required: true, maxLength: 10 })}
      />
      {errors.exampleRequired && <p>This field is required</p>}
      <input type="submit" />
    </form>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

export default App;

答案#1

虽然代码可以运行,但 TS 会警告你无法从你的代码中推断出 data 的类型,因此它会回退到隐式的 any。你需要手动设置 data 的类型,或者在某处设置一个类型,使 TS 可以从中推断出 data 的类型。

在这种情况下,您需要在调用 useForm() 时传入表单数据的定义(参见文档)。您还需要用 handleSubmit 包裹 onSubmit。示例 - 沙箱。

type FormData = {
  example: string;
  exampleRequired: string;
};


function App() {    
  const { register, handleSubmit, watch, errors } = useForm<FormData>();
  const onSubmit = handleSubmit(data => {
    console.log(data);
  }); 

并使用 onSubmit:

<form onSubmit={onSubmit}>

答案#2

那是一个 TypeScript 错误,不是运行时错误。它的意思是你定义了一个函数(onSubmit),其参数(data)没有指定类型。

结合这里和这里的 TypeScript 示例,你应该这样做:

import React from "react";
import { useForm, SubmitHandler } from "react-hook-form";
// -------------^^^^^^^^^^^^^^^
import ReactDOM from "react-dom";

import "./styles.css";

type Inputs = {
  example: string,
  exampleRequired: string,
};

function App() {
  const { register, handleSubmit, watch, errors } = useForm<Inputs>();
  const onSubmit: SubmitHandler<Inputs> = data => {
  // -----------^^^^^^^^^^^^^^^^^^^^^^^
    console.log(data);
  };

  ...