无法在打字稿中声明 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;
`
我正在尝试在打字稿中创建一个带有钩子的上下文,如下所示:
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;
`