#typescript# 在.d.ts文件中声明enum

2022-07-01  本文已影响0人  taiyosen

今天遇到一个报错,在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

上一篇下一篇

猜你喜欢

热点阅读