Reactjs 无法在typescript中声明React上下文?

Reactjs 无法在typescript中声明React上下文?,reactjs,typescript,react-hooks,react-context,Reactjs,Typescript,React Hooks,React Context,我试图在typescript中创建一个带有钩子的上下文,如下所示: interface SettingsStateContextProps { sort: string; type: string; price: string; option_full: boolean; option_rated: boolean; option_free: boolean; } export const SettingsStateContext = React.createConte

我试图在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?我收到一条错误消息

'找不到命名空间'SettingsStateContext'


我该如何解决这个问题?

我知道你没有在React.createContent后面放任何方括号,你应该像React.createContext这样写

把你的逻辑放在方括号里,我应该工作

你可以通过学习了解更多


谢谢

我明白了,你没有在React.createContent后面放任何方括号,你应该像React.createContext这样写

把你的逻辑放在方括号里,我应该工作

你可以通过学习了解更多


谢谢

我不确定你的第二次出口。以下是我如何使用它:

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;
`

我不确定你的第二次出口。以下是我如何使用它:

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;
`

文件的扩展名是tsx吗?不,改为.tsx WORKED文件的扩展名是tsx吗?不,改为.tsx WORKED带有Partial没有必要把任何东西放在括号里。我不知道Partial!你可以在这里读到:对于Partial,没有必要把任何东西放在括号里。我对Partial没有任何线索!您可以在此处阅读: