typescript 类型上不存在从React上下文导入函数

bpzcxfmw  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(98)

我目前正在尝试为我的React应用程序做一个相当低级别的Typescript迁移。应用程序本身使用上下文,它在上下文中定义各种函数,并在需要时将它们导出到其他地方使用。
以下是我的“DataContext”文件:

export const DataContext = React.createContext({})

export const DataProvider = ({ children }: PropsWithChildren) => {

    const fetchAll = async (userId: string) => {

        // Function here

    }

    return (
        <DataContext.Provider value={{ fetchAll }}>
            { children }
        </DataContext.Provider>
    )

}

但是,当我尝试将此文件导入另一个Typescript文件时,出现以下错误:
类型“{}”上不存在属性“fetchAll”
我假设这是因为在我的'createContext'上我使用了一个空对象。但是有没有其他的方法可以做到这一点,这是不是造成了我的错误?
下面是我在本例中导入“fetchAll”函数的文件:

import React, { useEffect, useContext } from 'react'

import { DataContext } from '../../context/DataContext'

type Props = {
    text: string,
    subcontent: string,
    id: string
}

export const Pending = ({ text, subcontent, id }: Props) => {

    const { fetchAll } = useContext(DataContext)

    // I use fetchAll in a useEffect, but removed it for simplicity

    return (
        // Component here...
    )
}

任何建议/指点都将不胜感激!

n3ipq98p

n3ipq98p1#

为了能够检索fetchAll,必须设置上下文的类型

export const DataContext = React.createContext<{
   fetchAll: (userId: string) => Promise<WhateverIsTheReturnType>
}>(null)

然后,我将设置一个钩子来检索上下文值,如下所示

const useDataContext = () => {
  const value = useContext(DataContext)
  if (value === null) {
    throw new Error(
      '`DataContext` should always have `DataProvider` as a parent component',
    )
  }

  return value
}

所以你可以这样使用const {fetchAll} = useDataContext()

相关问题