React Typescript 钩子错误 - 此表达式不可调用

Posted

技术标签:

【中文标题】React Typescript 钩子错误 - 此表达式不可调用【英文标题】:React Typescript hook error - This expression is not callable 【发布时间】:2020-08-16 00:15:00 【问题描述】:

我遇到了这个问题,因为我将代码从 React javascript 移到了 React Typescript

我有一个简单的钩子,可以从开/关(或真假)切换状态(下面的代码) 因为这段代码是在 Javascript 上工作的,所以我一直在努力解决这个问题

Code here to test it

所以切换功能有一些错误但无法解决。一些帮助将不胜感激

// useToggle.tsx
import  useState  from "react";

export const useToggle = (initialMode = false) => 
  const [open, setOpen] = useState(initialMode);
  const toggle = () => setOpen(!open);
  return [open, setOpen, toggle];
;

我的开关组件

// Switch.tsx
import  useToggle  from "./useToggle";

import React from "react";

export const Switch = () => 
  const [open, toggle] = useToggle();
  const [open2, toggle2] = useToggle();
  return (
    <>
      <p>Testing toggle 1: `$open`</p>
      <p>Testing toggle 2: `$open2`</p>
      <button
        onClick=() => 
          toggle();
        
      >
        Toggle 1
      </button>
      <button
        onClick=() => 
          toggle2();
        
      >
        Toggle 2
      </button>
    </>
  );
;

现在我使用我的开关组件

// App.tsx
import * as React from "react";
import "./styles.css";
import  Switch  from "./Switch";

export default function App() 
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <Switch />
    </div>
  );

【问题讨论】:

【参考方案1】:

解决问题需要做两处改变

首先,要消除错误,您需要使用const assertion 之类的方式返回值

return [open, toggle, setOpen] as const;

Here is a Link 到 github issue 获取错误

其次,您在销毁时使用切换作为第二个参数,因此您也需要将其作为第二个参数返回

Working DEMO

【讨论】:

它有效!非常感谢。我需要更多地研究 const 断言以完全理解它:)

以上是关于React Typescript 钩子错误 - 此表达式不可调用的主要内容,如果未能解决你的问题,请参考以下文章

如何测试使用自定义TypeScript React Hook的组件?

如何在 React 中正确使用 useState 钩子和 typescript?

无法使用 Typescript 中的 React 钩子在 Ag-Grid 中获取 gridApi

Typescript 和 React 中的嵌套映射返回错误,此表达式不可调用

React - useRef 与 TypeScript 和功能组件

如何在我的组件库中使用 React 钩子?