如何将 TypeScript 与 reactjs useContext 的自定义挂钩一起使用?

How to use TypeScript with a custom hook for reactjs useContext?

我正在尝试重构我的上下文以在 TypeScript 中使用自定义挂钩,但出现错误我不知道如何修复。

这是错误:

This expression is not callable. Not all constituents of type 'boolean | Dispatch<SetStateAction>' are callable. Type 'false' has no call signatures. TS2349

我的自定义钩子是这样定义的:

export const useOfflineContext = () => {
  const isOffline = React.useContext(OfflineContext);
  const setIsOffline = React.useContext(OfflineSetContext);

  if (!setIsOffline) {
    throw new Error('The OfflineProvider is missing.');
  }
  return [isOffline, setIsOffline];
};

我这样称呼它:

  const [setIsOffline] = useOfflineContext();

  // Check if we are online or offline.
  useEffect(() => {
    Network.addListener('networkStatusChange', (networkStatus) => {
      // console.log('Network status changed', networkStatus);
      if (!networkStatus.connected) {
        setIsOffline(true);

这会导致上述错误。

这是我的完整组件OfflineContextProvider.tsx:

import React, { useState } from 'react';

const OfflineContext = React.createContext(false);
const OfflineSetContext = React.createContext({} as React.Dispatch<React.SetStateAction<boolean>>);

interface MyProps {
  children: JSX.Element,
}

export const OfflineContextProvider: React.VFC<MyProps> = ({ children }: MyProps) => {
  const [isOffline, setIsOffline] = useState<boolean>(false);

  return (
    <OfflineContext.Provider value={isOffline}>
      <OfflineSetContext.Provider value={setIsOffline}>
        {children}
      </OfflineSetContext.Provider>
    </OfflineContext.Provider>
  );
};

export const useOfflineContext = () => {
  const isOffline = React.useContext(OfflineContext);
  const setIsOffline = React.useContext(OfflineSetContext);

  if (!setIsOffline) {
    throw new Error('The OfflineProvider is missing.');
  }
  return [isOffline, setIsOffline];
};

我不明白为什么,当我特别要求 const [setIsOffline] = useOfflineContext(); 时,TypeScript 认为我可能想要 isOffline(因为 TypeScript警告提到布尔值(isOffline)。)

所以我的问题是:在 return 上下文的自定义挂钩中使用时如何正确键入 useState?

目前正在使用 TypeScript 4.3。

您使用的是返回数组的第一个元素,即 isOffline(布尔值),但您称它为 setIsOffline。但是,它仍然是一个布尔值。

您可能想要的是获取数组的第二个元素:

const [ , setIsOffline ] = useOfflineContext();