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

TypeScript集成jQuery报错:Uncaught TypeError: $ is not a function 求助

我之前也碰到过一模一样的问题!结合你的编译流程和浏览器能识别$的情况,大概率是TypeScript类型声明或者Webpack模块加载的问题,给你几个排查方向:

1. 确认TypeScript的jQuery类型声明是否正确安装
  • 首先得确保你装了@types/jquery,毕竟TypeScript需要类型定义才能正确识别$和jQuery对象,执行这个命令就行:
    npm install @types/jquery --save-dev
    
  • 然后去tsconfig.json里检查下types数组有没有包含jquery,或者typeRoots是不是指向了node_modules/@types目录,配置大概是这样:
    {
      "compilerOptions": {
        "types": ["jquery"],
        "typeRoots": ["node_modules/@types"]
      }
    }
    
2. 处理Webpack的模块加载冲突

Webpack有时候会把jQuery包装成ES模块,导致全局的$没正确挂载,或者代码里的$被当成局部变量处理,试试这两个办法:

  • 用ProvidePlugin自动注入:在Webpack配置里加个ProvidePlugin,让Webpack自动把$和jQuery注入到每个模块里,不用你手动import:
    const webpack = require('webpack');
    
    module.exports = {
      // ...你的其他配置
      plugins: [
        new webpack.ProvidePlugin({
          $: 'jquery',
          jQuery: 'jquery'
        })
      ]
    };
    
  • 暴露全局变量(适合CDN引入的情况):如果你是用CDN加载jQuery,不想让Webpack把它打包进去,可以在Webpack配置里加externals,告诉它直接用全局的jQuery变量:
    module.exports = {
      // ...其他配置
      externals: {
        jquery: 'jQuery'
      }
    };
    
    同时在你的TypeScript代码顶部加个声明,确保TS能识别全局的$:
    declare const $: JQueryStatic;
    
3. 排查代码里的局部变量覆盖

有时候不小心在函数或者模块里定义了同名的$变量,比如这样:

function handleForm($: string) {
  // 这里的$是字符串类型,调用$()肯定会报错!
  $('#form').submit();
}

仔细检查下你的代码,有没有这种局部变量覆盖全局$的情况。

4. 确认jQuery的加载顺序

虽然你说浏览器能识别$,但还是要确认jQuery是在你的编译后代码之前加载的。如果是CDN引入,要把jQuery的<script>标签放在你的bundle.js前面;如果是npm安装的,用ProvidePlugin的话一般没问题,但可以看下打包后的代码,确认jQuery代码是不是在你的业务代码之前执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:16:19