Пользовательская реакция ловит useToggle в Typescript - PullRequest
1 голос
/ 13 февраля 2020

Я написал пользовательский хук для переключения логического значения и значения:

import { useState } from 'react';

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

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

  return [value, toggleValue];
}

Затем я использую его, как показано ниже:

 const [modalOpen, setModal] = useToggle(false);

Но получаю ошибки:

Тип 'логическое значение | (() => void) 'нельзя назначить типу' boolean | ((() => void) & false) | ((() => void) & true) '. Тип '() => void' нельзя назначить типу 'boolean | ((() => void) & false) | ((() => void) & true) '. Тип '() => void' нельзя назначить типу '(() => void) & false'. Тип '() => void' нельзя назначить типу 'false'.

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

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')
)
<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>
0 голосов
/ 13 февраля 2020

Возможно, вам потребуется определить тип возврата вашего хука. Это должно выглядеть примерно так.

import { useState } from 'react';

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

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

  return [value, toggleValue];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...