今天遇到一个报错,在xxx.d.ts中声明了一个枚举,如下所示
/// typings/xxx.d.ts
export enum EnumABC {
a = 'a',
b = 'b',
c = 'c'
}
在yyy.ts中使用这个枚举,如下所示
function doSomething(): EnumABC {
return EnumABC.a;
}
编译后运行会遇到如下报错
node:internal/modules/cjs/loader:949
throw err;
^
Error: Cannot find module './typings/xxx'
Require stack:
- F:\proj\lib\index.js
at Module._resolveFilename (node:internal/modules/cjs/loader:946:15)
at Module._load (node:internal/modules/cjs/loader:787:27)
at Module.require (node:internal/modules/cjs/loader:1012:19)
at Module._compile (node:internal/modules/cjs/loader:1112:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1166:10)
at Module.load (node:internal/modules/cjs/loader:988:32)
at Module._load (node:internal/modules/cjs/loader:834:12)
at Module.require (node:internal/modules/cjs/loader:1012:19) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'F:\\proj\\lib\\index.js'
]
}
报错很明确,找不到模块'./typings/xxx'
,因为这是一个声明文件。把这个枚举定义在其他模型文件中即可解决问题。但如果就想声明在.d.ts文件中呢?只要把枚举的声明由export enum
改为export const enum
即可。因为后者在编译成js后,相关枚举的引用会直接替换成对应的值,就不存在引用不存在的模块的问题了。
关于这两种声明方式的具体区别,网上资料很多,譬如:
ts中 enum和const enum的区别
当然,也有不适合使用const enum
的情况:TypeScript: Don’t Export const enums
网友评论