Typescript 中的自定义反应钩子 useToggle

hei*_*584 5 typescript reactjs react-hooks

我编写了用于切换布尔和值的自定义钩子:

import { useState } from 'react';

export function useToggle(initialValue: boolean) {
  const [value, setValue] = useState<boolean>(initialValue);

  const toggleValue = () => setValue(!value);

  return [value, toggleValue];
}
Run Code Online (Sandbox Code Playgroud)

然后我像下面这样使用它:

 const [modalOpen, setModal] = useToggle(false);
Run Code Online (Sandbox Code Playgroud)

但出现错误:

输入“布尔值|” (() => void)' 不可分配给类型 'boolean | ((() => void) & false) | ((() => void) & true)'。类型“() => void”不可分配给类型“boolean |” ((() => void) & false) | ((() => void) & true)'。类型“() => void”不可分配给类型“(() => void) & false”。类型“() => void”不可分配给类型“false”。

小智 5

您可能需要定义钩子的返回类型。它应该看起来像这样。

import { useState } from 'react';

export function useToggle(initialValue: boolean): [boolean, () => void] {
  const [value, setValue] = useState<boolean>(initialValue);

  const toggleValue = () => setValue(!value);

  return [value, toggleValue];
}
Run Code Online (Sandbox Code Playgroud)


zyn*_*nkn 1

const {useRef, useState} = React;

function useToggle(initialState){
  const [value, setValue] = useState(initialState);
  const toggle = () => { setValue(!value) };
  
  return [value, toggle];
};

function App(){
  const [modal, setModal] = useToggle(false);
  return (
    <div>
      <button onClick={setModal}>Toggle!</button>
      {modal && <span>Toggle!!!!</span>}
    </div>
  )
}

ReactDOM.render(
  <App />, document.getElementById('root')
)
Run Code Online (Sandbox Code Playgroud)
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>
Run Code Online (Sandbox Code Playgroud)