Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何使动态类型可调用(react custom hook)_Typescript_React Hooks_Typeguards_Type Narrowing - Fatal编程技术网

Typescript 如何使动态类型可调用(react custom hook)

Typescript 如何使动态类型可调用(react custom hook),typescript,react-hooks,typeguards,type-narrowing,Typescript,React Hooks,Typeguards,Type Narrowing,假设我有一个自定义钩子,在一个数组中返回3个东西 export const useInput = (store: string) => { const [value, setValue] = React.useState(store); const bind = { value, onChange: (e: InputChangeEvent) => { setValue(e.target.value) } } const re

假设我有一个自定义钩子,在一个数组中返回3个东西

export const useInput = (store: string) => {
  const [value, setValue] = React.useState(store);

  const bind = {
    value,
    onChange: (e: InputChangeEvent) => {
      setValue(e.target.value)
    }
  } 

  const reset = () => {
    setValue(store)
  }

  return [value, bind, reset]
}
并在组件中使用它

const SomeComponent = () => {
  const [name, bindName, resetName] = useInput('')
  const [email, bindEmail, resetEmail] = useInput('')
  const [confirmEmail, bindConfirmEmail, resetConfirmEmail] = useInput('')

  const onSubmitHandler = (e: FormSubmitEvent) => {
    e.preventDefault()
    console.log(`${name} ${email} ${confirmEmail}`)
    resetName();
  }
  return (
    <React.Fragment>
      <form onSubmit={onSubmitHandler}>
        <div className={styles.modalTitle}>
          {homeText.action}
        </div>
        <div className={styles.textInputContainer}>
          <input type="text" placeholder={homeText.plName} {...bindName}/>
          <ErrorMessage message={'sad'}/>
        </div>
        <div className={styles.textInputContainer}>
          <input type="email" placeholder={homeText.plEmail} {...bindEmail}/>
        </div>
        <div className={styles.textInputContainer}>
          <input type="email" placeholder={homeText.plConfirm} {...bindConfirmEmail}/>
        </div>
        <button>Submit</button>
      </form>
    </React.Fragment>
  )
}

这里的主要问题是
useInput
的返回类型是一个项目数组,其类型是您在
return[value,bind,reset]
中返回的3个值的交集,而不是您需要的元组

您可以使用
as const
要求typescript将数组值改为不可变元组,这将
useInput
的返回类型更改为元组:

return [value, bind, reset] as const

这里的主要问题是
useInput
的返回类型是一个项目数组,其类型是您在
return[value,bind,reset]
中返回的3个值的交集,而不是您需要的元组

您可以使用
as const
要求typescript将数组值改为不可变元组,这将
useInput
的返回类型更改为元组:

return [value, bind, reset] as const