TypeScript编译报TS2339错误:'ajax'属性不存在于jQuery类型上
错误产生原因
- 未安装jQuery对应的TypeScript类型定义文件,TS无法推导jQuery对象上挂载的静态方法、实例方法,自然识别不到
ajax属性。 - 直接导入本地jquery.js源文件的写法存在类型推导偏差,TS推导出的导入值类型为
typeof jQuery | ((w: any) => typeof jQuery),和运行时真实的jQuery静态对象结构不匹配,无法匹配到ajax方法的类型定义。 - 当前tsconfig配置未纳入全局类型声明路径,TS无法将代码中使用的jQuery对象和标准jQuery类型做关联。
解决方案
按以下顺序调整即可修复错误:
- 补充类型定义
在项目根目录执行以下命令,安装官方维护的jQuery、js-cookie类型定义文件,安装完成后TS会自动识别两个库的所有API类型:
npm install --save-dev @types/jquery @types/js-cookie
如果你的项目没有使用npm管理依赖,无法安装类型包,可以直接在TSScripts目录下新建global.d.ts文件,写入以下内容做临时类型声明:
// 全局声明jQuery和$的类型,跳过导入时的类型推导 declare const jQuery: JQueryStatic; declare const $: JQueryStatic;
- 修正导入语句
不要直接导入本地Scripts目录下的jquery.js、js.cookie源文件,改成标准导入写法:
// 按需选择别名,不需要同时导入$和jQuery import $ from 'jquery'; // import jQuery from 'jquery'; import Cookies from 'js-cookie';
如果你是通过HTML里的<script>标签全局引入jQuery,不需要在TS文件里写任何jQuery相关的import语句,只保留上面的d.ts全局声明即可,避免重复导入。
- 调整tsconfig.json配置
补充skipLibCheck配置避免第三方类型文件的校验冲突,同时把d.ts类型声明文件纳入编译范围,修改后的配置如下:
{ "compileOnSave": true, "compilerOptions": { "esModuleInterop": true, "allowJs": true, "target": "es6", "allowUnreachableCode": true, "noImplicitReturns": true, "noImplicitAny": false, "skipLibCheck": true, "outDir": "./AppScript" }, "include": [ "./TSScripts/*.ts", "./TSScripts/**/*.d.ts" ], "exclude": [ "node_modules", "wwwroot" ] }
- 校验代码调用
配置修改完成后重启TS服务/编辑器,代码里的$.ajax/jQuery.ajax调用就可以被TS正常识别,TS2339错误会直接消失。如果后续要逐个修复严格模式下的类型警告,直接给对应参数、变量补充类型标注即可,不会再阻塞编译流程。
提示:如果修改后仍存在类型识别问题,可以清空TS的类型缓存、重启编辑器后再试。
内容的提问来源于stack exchange,提问作者Aj.son
相关产品推荐
相关产品推荐

