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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:47