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

如何修复React-TypeScript中“This expression is not callable”错误

问题分析与解决

错误原因

你遇到的TS2349错误,核心是作用域命名冲突:
在AuthContextProvider组件内部,你声明了一个名为isAdmin的状态变量(const [isAdmin, setIsAdmin] = useState(false);),它的优先级高于外部导入的同名isAdmin函数。当你在useEffect里调用isAdmin("ROLE_ADMIN", roles)时,实际访问的是这个布尔类型的状态变量,而非你写的检查函数,所以TypeScript提示布尔值无法被调用。

解决方案

方案1:重命名状态变量

把组件内的isAdmin状态变量改成其他名称,比如isAdminUser,避免和导入的函数重名:

// 修改状态声明
const [isAdminUser, setIsAdminUser] = useState(false);

// 同步修改contextValues里的字段,保持对外暴露的字段名不变,不影响其他组件使用
const contextValues = {
  isAdmin: isAdminUser,
  isLoggedIn,
  username,
  token,
  email,
  login,
  logout,
};

方案2:重命名导入的函数

在导入isAdmin函数时,给它起一个别名,避免和内部状态冲突:

// 导入时重命名(替换为你的实际文件路径)
import isAdminChecker from './utils/isAdmin';

// 在useEffect里调用别名函数
let isAdminTest: boolean = isAdminChecker("ROLE_ADMIN", roles);

额外优化:简化isAdmin函数

你的isAdmin函数可以用数组原生的includes方法简化,逻辑更简洁高效:

const isAdmin = (targetRole: string, roles: string[]) => {
  return roles.includes(targetRole);
};
export default isAdmin;

内容的提问来源于stack exchange,提问作者Matan Almakaies

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:20:34