无法在打字稿中声明 React 上下文?

Cannot declare React context in typescript?

我正在尝试在打字稿中创建一个带有钩子的上下文,如下所示:

interface SettingsStateContextProps {
  sort: string;
  type: string;
  price: string;
  option_full: boolean;
  option_rated: boolean;
  option_free: boolean;
}

export const SettingsStateContext = React.createContext<
  Partial<SettingsStateContextProps>
>({});

export const SettingsStoreProvider:any = ({ reducer, initialState, children }):any => (
  <SettingsStateContext.Provider // ERROR HERE
    value={useReducer(reducer, initialState)}
    children={children}
  />
);

但出于某种原因我不知道为什么我不能声明 SettingsStateContext.Provider?我收到

的错误消息

'Cannot find namespace 'SettingsStateContext'

我该如何解决这个问题?

我看到这里你没有在React.createContent后面放任何方括号,你应该这样写React.createContext(),

export const SettingsStateContext = React.createContext();

将你的逻辑放在方括号中,我应该工作!

你可以研究here了解更多!

谢谢!

我不确定你的第二次导出。我是这样使用的:

1) 导出您的上下文以在任何地方使用它

import React, { useEffect } from 'react'
import { ThemeProvider } from 'styled-components'

// this is needed so that components using theme will see it's type
declare module 'styled-components' {
  interface DefaultTheme extends Theme {}
}

interface Theme {
  color: string
}

const defaultTheme = { color: 'red' }

export const ThemeContext = React.createContext<Partial<Theme>>({})

export const ThemeContextProvider = props => {
  const [theme, setTheme] = useState<Theme>(defaultTheme)

  return (
    <ThemeContext.Provider value={{ theme }}>
          {props.children}
    </ThemeContext.Provider>
  )
}

2) 在您想要访问主题的地方包装组件(我在应用程序的顶层使用过一次):

import React from 'react'
import { ThemeContextProvider, Input } from '@frontend'

export const App = () => {
  return (
    <ThemeContextProvider>
        <Input />
    </ThemeContextProvider>
  )
}

在组件中使用(共享组件示例):

import styled from 'styled-components'
import React, { forwardRef } from 'react'

type MyProps = {
  err?: boolean
}

export const Input = forwardRef<HTMLInputElement, MyProps>(({ err, ...rest }, ref) => {
  return <StyledInput {...rest} ref={ref} />
})

const StyledInput = styled.input<MyProps>`
  box-shadow: inset 0 0 0 1px ${({ err, theme }) => (err ? theme.badColor : theme.primaryColor)};
  border-radius: 5px;
`