TypeScript调用页面非TS文件函数编译报错,如何处理?
解决TypeScript无法识别全局函数MY_PERSONAL_FUNCTION的编译问题
这个问题我碰到过好几次了,其实就是TypeScript不知道全局环境里存在这个函数,给它补充类型声明就能让编译通过,给你几个实用的方案:
方案1:在当前TS文件顶部直接声明函数
如果这个函数只在当前文件里用到,最简单的方式就是在文件开头添加declare声明,告诉TypeScript这个函数的存在:
// 在你的TS文件最顶部添加这行声明 declare function MY_PERSONAL_FUNCTION(e: any): void; // 你的原有代码就可以正常编译了 var dataSource = new kendo.data.DataSource({ error: (e) => { MY_PERSONAL_FUNCTION(e); }, });
提示:如果知道e的具体类型(比如Kendo数据源的错误对象类型),把any换成实际类型会更规范,还能获得TypeScript的类型检查支持。
方案2:创建全局类型定义文件(.d.ts)
如果这个函数在多个TS文件里都要用到,推荐单独创建一个全局类型定义文件,这样不用每个文件都重复声明:
- 在项目根目录或者src目录下创建一个
global.d.ts文件,内容如下:
declare function MY_PERSONAL_FUNCTION(e: any): void;
- 确保你的
tsconfig.json里包含了这个文件,一般默认的include配置(比如["src/**/*"])会自动加载所有.d.ts文件,如果没有的话,手动添加到include数组里:
{ "compilerOptions": { /* 你的编译选项 */ }, "include": [ "src/**/*", "./global.d.ts" ] }
方案3:扩展Window接口(如果函数挂载在window上)
有些全局函数实际上是挂载在浏览器的window对象上的,这种情况下可以扩展TypeScript的Window接口来识别它:
// 扩展Window接口,添加你的函数类型 interface Window { MY_PERSONAL_FUNCTION: (e: any) => void; } // 调用时明确通过window访问(也可以直接调用,但加window更清晰) var dataSource = new kendo.data.DataSource({ error: (e) => { window.MY_PERSONAL_FUNCTION(e); }, });
这三种方案都能解决编译报错的问题,你可以根据项目的实际情况选择最适合的一种~
内容的提问来源于stack exchange,提问作者Ian Vink
相关产品推荐
相关产品推荐

