You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中使用React useContext解构Context提示属性不存在报错如何解决

问题根本原因

你在创建Web3Context时,指定的泛型类型是Web3 | null,且默认值传入了null。TypeScript 无法感知你的组件外层是否一定被Web3Provider包裹,所以它默认认为useContext(Web3Context)返回值的类型是联合类型Web3 | null,null类型上不存在nftContract属性,因此触发类型报错。


解决方案

方案1:非空断言(快速适配,确定外层一定包裹Provider时使用)

直接告诉 TypeScript 你可以保证取到的 Context 一定不为空,在useContext返回值后加!非空断言符即可:

const MintNFTForm = () => {
  const { nftContract } = useContext(Web3Context)!;
  // 后续业务逻辑
}

方案2:修改Context默认值,去除null类型

把Context的类型从Web3 | null改成纯Web3类型,给一个符合接口结构的默认空值,避免TS判定存在null可能:

// 修改Context创建代码
export const Web3Context = createContext<Web3>({
  gameContract: '',
  nftContract: '',
  provider: '',
  account: '',
  etherBalance: ''
});

修改后无需调整消费侧代码,TS不会再报该类型错误。

方案3:封装自定义消费Hook(推荐,兼顾类型安全和运行时报错提示)

封装一个专属的useWeb3钩子,内部做非空判断,既可以解决类型问题,还能在运行时检测到组件未被Provider包裹的异常场景:

// 在Context定义文件中新增这个钩子
export const useWeb3 = () => {
  const context = useContext(Web3Context);
  if (!context) {
    throw new Error('useWeb3 must be used within a Web3Provider');
  }
  return context;
}

消费侧直接使用自定义钩子即可:

const MintNFTForm = () => {
  const { nftContract } = useWeb3();
  // 后续业务逻辑
}

内容的提问来源于stack exchange,提问作者Adrian D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:06:05