javascript - React createContext 和 useContext 的打字稿
问题描述
我有一个带有状态提供程序的 React Context 文件来管理 cookie 首选项。这一切都按预期工作,但我在使用 Typescript 时遇到了 1 个问题。我的文件如下所示:
import Cookies from 'js-cookie';
import React, { Component, ReactNode } from 'react';
interface Props {
children: ReactNode | ReactNode[];
functionalCookiesOn: boolean;
performanceCookiesOn: boolean;
};
interface State {
functionalCookiesOn: boolean;
performanceCookiesOn: boolean;
};
// Initialise context storage
const CookiesContext = React.createContext({});
const { Consumer: CookiesConsumer } = CookiesContext;
class CookiesProvider extends Component<Props, State> {
constructor(props: Props) {
super(props);
const {
functionalCookiesOn,
performanceCookiesOn,
} = this.props;
this.state = {
functionalCookiesOn,
performanceCookiesOn,
};
}
componentDidUpdate(_prevProps: Props, prevState: State) {
const {
functionalCookiesOn,
performanceCookiesOn,
} = this.state;
// Set cookie to store functional cookies setting
if (functionalCookiesOn !== prevState.functionalCookiesOn) {
Cookies.set('functionalCookiesOn', functionalCookiesOn.toString());
}
// Set cookie to store performance cookies setting
if (performanceCookiesOn !== prevState.performanceCookiesOn) {
Cookies.set('performanceCookiesOn', performanceCookiesOn.toString());
}
}
toggleAllCookies = () => {
// Store reversed state for functional and performance cookies
this.setState((prevState: State) => ({
functionalCookiesOn: !prevState.functionalCookiesOn,
performanceCookiesOn: !prevState.performanceCookiesOn,
}));
}
render() {
const { children } = this.props;
const {
functionalCookiesOn,
performanceCookiesOn,
} = this.state;
const value = {
functionalCookiesOn,
performanceCookiesOn,
toggleAllCookies: this.toggleAllCookies,
};
return (
<CookiesContext.Provider value={value}>
{children}
</CookiesContext.Provider>
);
}
}
export default CookiesContext;
export { CookiesConsumer, CookiesProvider };
当我在另一个函数组件中使用它时,它看起来像这样:
const AnotherComponent = () => {
const {
functionalCookiesOn,
performanceCookiesOn,
toggleAllCookies,
} = useContext(CookiesContext);
return (
...
);
}
这会引发错误,例如:
Property 'functionalCookiesOn' does not exist on type '{}'.
在我看来,这与原始文件中的以下行有关:
const CookiesContext = React.createContext({});
因为我用一个空对象初始化上下文(因为在那个阶段它没有值)。
初始化此或应用类型以避免此错误的正确方法是什么?
解决方案
我认为你可以为你的电话提供一个类型createContext
const CookiesContext = React.createContext<Partial<Props>>({});
<Partial>
允许您创建没有默认值的上下文。
推荐阅读
- pandas - 从刮擦中清除日期
- react-native - 如何使用在返回函数上方声明的函数中的变量?
- django - 直接使用反序列化的 Django 对象
- javascript - 作为对象推送,或作为单独的项目推送
- javascript - 如何在javascript中将rgb颜色转换为颜色名称字符串
- javascript - 如何删除外部嵌入表单的字体样式?
- python - Python - 如何按定义的顺序将类变量存储到数组中
- mysql - Manytomanyfields通过表数据list_diplay重复分组数据
- flutter - 线程“主”javax.net.ssl.SSLException 中的异常颤振错误:连接已关闭:javax.net.ssl.SSLException:标记不匹配
- android - 反应原生应用程序崩溃而没有错误日志,如何检测错误?