reactjs - typescript react 上下文+类型 '{}'没有调用签名

标签 reactjs typescript react-context

我已经创建了一个 Notification Toast 服务,除了 ToastContext 周围的一些 typescript 错误外,它似乎可以正常工作。

在我导入连接到 contextProvider 的 useToast() Hook 的任何页面上调用 toast。 toast(...) 函数出现 typescript 错误。我收到的错误是

错误 这个表达式是不可调用的。类型“{}”没有调用签名。

toast Hook

<button
    onClick={() => {
        return toast({
            title: "I am toasty"
        });
    }}
>Toast Me</button>

上下文和使用上下文钩子(Hook)

export const ToastContext = createContext({});

export function useToast() {
  return useContext(ToastContext);
}

这里是当前代码的codesandbox https://codesandbox.io/s/dazzling-spence-clehl .

我尝试用 createContext 键入

interface ContextType {
   toasts: []
   toast: () => void
}

export const ToastContext = createContext<ContextType | {}>({});

最佳答案

你的上下文值是一个函数,而你用一个空对象初始化上下文(为什么?),所以静态类型评估,调用toast()是尝试在对象 ( '{}' has no call signatures ) 上发出函数。

根据其用途修复您的初始化:

// toast is a function
<ToastContext.Provider value={toast}>{children}</ToastContext.Provider>

export const ToastContext = createContext((payload: any) => {});

或者,我猜你最初的想法是尝试做类似的事情:

// import ToastProps
interface ContextType {
  toasts: [] | ToastProps[];
  toast: (payload: any) => void;
}

export const ToastContext = createContext<ContextType>({
  toast: () => {},
  toasts: []
});

// Initilization
const { toast, toasts } = useToasts();

// Pass ContextType
<ToastContext.Provider value={{toast, toasts}}>{children}</ToastContext.Provider>

// Context usage
const { toast } = useToast();
toast(); // is a function, GOOD

在哪里ContextType火柴useToast返回值和 createContext (尝试使用 ContextType 返回值重用 useToast)。

Edit Context Types Fix

关于reactjs - typescript react 上下文+类型 '{}'没有调用签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66086971/

相关文章:

reactjs - 如何在 typescript 中设置初始 React 状态?

javascript - 根据参数注入(inject)正确的服务

javascript - 新的 React Context API 会触发重新渲染吗?

javascript - protected 路由、上下文 API 和 firebase 用户身份验证请求的问题

typescript - 仅检查其存在后,TS 属性不存在

javascript - React Context vs React Redux,我应该什么时候使用它们?

javascript - 如何避免 React Native 中的 jsx 样式错误?

css - 在方形和圆形按钮内将 fontawesome 组件与 faPlay 图标居中

javascript - NextJS React 应用程序样式组件未正确渲染 : Warning: Prop `className` did not match

typescript - 类型参数不可分配给类型参数