2018年在TypeScript中使用无@types的Node.js模块的正确方法
2018年TypeScript使用无.d.ts Node.js模块的正确姿势
兄弟,我2018年搞TS Node项目时刚好踩过一模一样的坑,给你几个亲测有效的方案,能完美解决你遇到的TS2304和qs.escape那俩错误:
一、先搞定「Cannot find name 'require'」的TS编译错误
这个问题本质是TypeScript默认不认识Node.js的全局require函数,2018年的标准解决方式是:
- 先装Node.js的类型定义包:
npm install @types/node --save-dev - 然后修改你的
tsconfig.json,确保这几个配置项正确:{ "compilerOptions": { "module": "CommonJS", // 因为weather-js是CommonJS模块 "types": ["node"], // 引入Node的全局类型 "allowJs": true // 允许项目里混存JS文件,可选但有用 } } - 要是不想改全局配置,也可以在单个用到
require的文件顶部加个临时声明:declare var require: any;
二、解决「TypeError: qs.escape is not a function」的运行时错误
这个坑是因为weather-js依赖的qs版本和你项目里的版本冲突,或者TS的模块解析逻辑搞乱了导出。2018年最靠谱的解决方式是:
- 直接用
require导入模块,再加个类型断言让TS别瞎管类型:const weather = require('weather-js') as any; - 然后正常调用模块的方法就行,比如查天气的示例:
weather.find({ search: 'Beijing', degreeType: 'C' }, (err, result) => { if (err) return console.error(err); console.log('天气结果:', result); }); - 别用
import导入!2018年TS对CommonJS模块的ES导入支持还没那么稳定,很容易出导出不匹配的问题,老老实实用require+any断言最稳妥。
三、兜底方案(前面的都不行再用)
如果还是有问题,你可以在tsconfig.json里把noImplicitAny设为false,这样TS就不会因为any类型报错了。不过这是下策,尽量优先用前面的方法,别全局关闭类型检查,不然TS的意义就没了一半。
内容的提问来源于stack exchange,提问作者Marvos
相关产品推荐
相关产品推荐

