【问题标题】:Cannot declare React context in typescript? [duplicate]无法在打字稿中声明 React 上下文? [复制]
【发布时间】:2020-03-20 03:08:00
【问题描述】:

我正在尝试使用钩子在 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'

我该如何解决这个问题?

【问题讨论】:

  • 文件的扩展名是tsx吗?
  • 不,更改为 .tsx 有效

标签: reactjs typescript react-hooks react-context


【解决方案1】:

我不确定您的第二次出口。这是我如何使用它:

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

【讨论】:

    【解决方案2】:

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

    export const SettingsStateContext = React.createContext();
    

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

    您可以学习here以了解更多信息!

    谢谢!

    【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2017-09-12
    • 2017-02-16
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多