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

如何将Node模块中的TypeScript命名空间添加至全局命名空间?

解决全局使用Moment官方TypeScript类型的问题

我之前也踩过类似的坑,老项目依赖自定义类型久了,切换官方类型确实容易遇到各种配置问题,给你一步步捋清楚解决方案:

第一步:先清理旧的自定义类型

首先把你项目里自己维护的moment.d.ts删掉或者重命名备份(比如改成moment-custom-old.d.ts),官方类型和自定义类型肯定会冲突,这是最容易忽略的前提。

第二步:确保安装了官方类型

如果还没装,先执行命令安装官方类型包:

npm install @types/moment --save-dev
# 或者用yarn
yarn add @types/moment -D

第三步:修正TypeScript配置(解决"no inputs were found"错误)

你之前用include引入Node模块里的类型文件是方向错了——include是用来指定需要编译的源码文件的,类型文件应该用typeRoots或types字段来配置。

打开你的tsconfig.json,调整compilerOptions部分:

{
  "compilerOptions": {
    // 保留你原有的其他配置
    "typeRoots": ["node_modules/@types"], // 确保这个字段存在,默认TS会自动识别,但如果之前被修改过要加回来
    "types": ["moment"], // 显式指定要加载的全局类型
    "module": "CommonJS", // 或者你项目使用的模块类型,比如ESNext
    "target": "ES6"
  },
  "include": ["src/**/*"], // 这里只放你的项目源码目录,不要包含node_modules
  "exclude": ["node_modules"]
}

这样配置后,TS会自动从node_modules/@types里加载moment的官方类型,同时include只指向你的源码,TS有了可编译的输入文件,就不会再出现"no inputs were found"的错误。

第四步:解决"moment refers to a UMD global"错误

这个错误的核心是:你的文件里有import/export语句,导致它变成了ES模块,而全局变量在模块作用域里不能直接使用。解决方法有两种:

方法1:改用ES模块导入(推荐)

如果项目允许,直接在需要用moment的文件里用模块导入:

import moment from 'moment';

// 正常使用
moment().format('YYYY-MM-DD');

方法2:在模块里声明全局moment(兼容旧代码)

如果要保留全局使用的写法,在有import/export的文件顶部加一句声明:

declare var moment: typeof import('moment');

// 之后就能直接用全局moment了
moment().format('YYYY-MM-DD');

最后验证

配置完后,重启一下TS的语言服务(比如VSCode里按Ctrl+Shift+P选择"TypeScript: Restart TS Server"),然后试试使用moment,应该就不会报错了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:25:32