用打字稿反应上下文

Posted

技术标签:

【中文标题】用打字稿反应上下文【英文标题】:React context with typescript 【发布时间】:2020-12-19 14:35:48 【问题描述】:

我想在我的 React Typescript 项目中使用上下文,我该怎么做?

我有以下代码: 应用.js

import Context from 'context'

const App = () => 
  const [value, setValue] = useState("");
  return (
    <Router>
       <Context.Provider value=value, setValue>
       ... some routes
       </Context.Provider>
    </Router>
  )

然后在我的 context.js 文件中我有:

import createContext from 'react';

type ValueContextType = 
  value: string;
  setValue: (value: string) => void;


export const ValueContext = createContext<ValueContextType | undefined>(undefined);

我想用它在另一个文件中设置状态。假设 users.js

import ValueContext from 'context'

const Users () => 
  const value, setValue = useContext(ValueContext);

现在 value 和 setValue 的错误信息相同的问题:

类型“ValueContextType”上不存在属性“setValue”|未定义'

我怎样才能做到这一点?

【问题讨论】:

你在哪里定义setTitle 抱歉,打错了!它是设置值。现已更新。 没有对您的解决方案的任何概述,这可能是矫枉过正;这应该通过使用 Redux 存储来共享吗? 无法共享整个解决方案,因为它包含 100 个文件。我对 redux 还不是很满意,所以现在上下文效果更好。但我已经发布了一个有效的答案。 【参考方案1】:

我找到了一个可行的解决方案:

App.js

import Context from 'context'

const App = () => 
  type ValueContextType = 
  value: string;
  setValue: (value: string) => void;
  
  const [value, setValue] = useState<ValueContextType | any>("");
  return (
    <Router>
       <Context.Provider value=value, setValue>
       ... some routes
       </Context.Provider>
    </Router>
  )

然后在我的 context.js 文件中我有:

import createContext from 'react';

type ValueContextType = 
  value: string;
  setValue: (value: string) => void;


export const ValueContext = createContext<ValueContextType | any>("");

users.js

import ValueContext from 'context'

const Users () => 
  const value, setValue = useContext(ValueContext);

我不知道这是否“hacky”,但它有效。

【讨论】:

const [value, setValue] = useContext(ValueContext);

以上是关于用打字稿反应上下文的主要内容,如果未能解决你的问题,请参考以下文章

反应/打字稿:参数“道具”隐含了“任何”类型错误

如何检查泛型 K 是不是属于泛型 M |打字稿通用 |还原

绑定和返回函数中的“this”上下文中的打字稿错误

带有打字稿的 Apollo 网关不会在上下文中接受用户 ID

打字稿自定义装饰器:this的上下文

在打字稿进口NPM包