美文网首页
#typescript# 在.d.ts文件中声明enum

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

作者: taiyosen | 来源:发表于2022-07-01 19:12 被阅读0次

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

    相关文章

      网友评论

          本文标题:#typescript# 在.d.ts文件中声明enum

          本文链接:https://www.haomeiwen.com/subject/ioocbrtx.html