【问题标题】:What is the correct type to use for this React form field hook?这个 React 表单字段挂钩的正确类型是什么?
【发布时间】:2019-04-29 20:17:50
【问题描述】:

我有一个 React 钩子(使用 typescript),但如果我使用 any 作为初始值的类型,我只能让它工作。

我尝试了HTMLInputElementReact.FormEvent(甚至React.FormEvent<HTMLInputElement>)的组合以及使用input type="text" 尝试将输入元素限制为type: string.

这是钩子:

import { useCallback, useState } from "react";

export default function useField(initialValue: any) {
  const [value, setValue] = useState(initialValue);

  const handleUpdate = useCallback(
    ({ currentTarget: { type, checked, value } }) => {
      setValue(type === "checkbox" ? checked : value);
    },
    []
  );

  return [value, handleUpdate];
}

这就是它被使用的地方:

import useField from "./hooks/useField";

const App = () => {
  const [firstName, setFirstName] = useField("");
  const [lastName, setLastName] = useField("");
  const [age, setAge] = useField("");

  return (
    <div className="App">
      <form>
        <input value={firstName} name="firstName" onChange={setFirstName} />
        <input value={lastName} name="lastName" onChange={setLastName} />
        <input value={age} name="age" onChange={setAge} />
      </form>
    </div>
  );
};

export default App;

它实际上是使用initialValue: any,但我觉得类型应该比这更具体。如果我将其更改为更具体的类型(例如字符串),则会出现以下两个错误。

(JSX attribute) React.InputHTMLAttributes<HTMLInputElement>.onChange?: ((event: React.ChangeEvent<HTMLInputElement>) => void) | undefined
Type 'string | (({ currentTarget: { type, checked, value } }: any) => void)' is not assignable to type '((event: ChangeEvent<HTMLInputElement>) => void) | undefined'.
  Type 'string' is not assignable to type '((event: ChangeEvent<HTMLInputElement>) => void) | undefined'.ts(2322)
index.d.ts(1977, 9): The expected type comes from property 'onChange' which is declared here on type 'DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>'

第二个是关于输入 onChange 事件:

(JSX attribute) React.InputHTMLAttributes<HTMLInputElement>.onChange?: ((event: React.ChangeEvent<HTMLInputElement>) => void) | undefined
Type 'string | (({ currentTarget: { type, checked, value } }: any) => void)' is not assignable to type '((event: ChangeEvent<HTMLInputElement>) => void) | undefined'.
  Type 'string' is not assignable to type '((event: ChangeEvent<HTMLInputElement>) => void) | undefined'.ts(2322)
index.d.ts(1977, 9): The expected type comes from property 'onChange' which is declared here on type 'DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>'

今天是我使用 Typescript 的第一天,所以这可能是非常明显的事情!

【问题讨论】:

    标签: reactjs typescript react-hooks


    【解决方案1】:

    如果你不指定返回类型,TypeScript 会推断它。我将从一个简单的例子开始:

    function strNum() {
      return [1, 'a'];
    }
    

    这会返回类型(string | number)[],即可以包含字符串或数字元素的数组。

    useField 返回string | (event: ChangeEvent&lt;HTMLInputElement&gt;) =&gt; void 的数组。这意味着数组的任何元素都可以是这两种类型中的任何一种,并且它们彼此不兼容。

    相反,您可以将返回类型指定为元组。这是一个具有特定元素类型的集合长度数组。

    useField(initialValue: string): [string, (event: React.ChangeEvent<HTMLInputElement>) => void] {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2021-04-28
      • 2019-10-20
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多