代码之家  ›  专栏  ›  技术社区  ›  pbanka

我的Typescript/Ember 3.1应用程序中有一个枚举,运行时出现导入错误。发生什么事了?

  •  5
  • pbanka  · 技术社区  · 6 年前

    我有一个正在导入枚举类型的ember组件,如下所示:

    import { StateNames, CardSummary } from '../../types/snowcat/state-types'
    

    类型文件如下:

    export enum CardState {
      error = 'error',
      new = 'new',
      okay = 'okay',
      warning = 'warning',
    }
    

    然后,我在组件中使用枚举,如下所示:

      @computed('cardSummary.cardState')
      get type(): string {
        if ([CardState.new, CardState.okay, CardState.warning].includes(this.cardSummary.cardState)) {
          return 'info'
        }
        return 'error'
      }
    

    代码似乎一切正常。代码生成时,我没有收到任何TypeScript错误,但我 获取运行时错误:

    loader.js:247 Uncaught Error: Could not find module `types/snowcat/state-types` imported from `snowcat/models/certificate`
        at missingModule (loader.js:247)
        at findModule (loader.js:258)
        at Module.findDeps (loader.js:168)
        at findModule (loader.js:262)
        at requireModule (loader.js:24)
        at r (loader.js:176)
        at ember-data.js:39
        at Array.forEach (<anonymous>)
        at getDsModels (ember-data.js:36)
        at getModels (ember-data.js:66)
    

    发生什么事了?如何修复此问题?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Chris Krycho    6 年前

    这是因为 types 模块不包括 汇编 通过ember cli类型脚本。纯类型声明可以很好地工作,因为它们在编译时被擦除。然而 enums have runtime representations, not just compile-time representations 与TypeScript中的几乎所有内容不同!(您有时可以使用 const enum 类型,但它们有自己的权衡。)

    在任何情况下,因为ember cli typescript在默认情况下不包括 类型 编译目录-仅用于类型解析-结果是您可以将枚举用作 类型 但你不能用它们来真正创造价值,这主要违背了这一点。

    最好的办法是 your-app/types/ 对于仅声明存在于应用程序外部的类型,或在应用程序中没有运行时表示的常见类型,并将具有与之关联的运行时功能的类型放入 your-app/app/lib 。然后,您可以从任何模块中导出类型,并在整个应用程序中像正常情况一样重用它们。

    或者,您可以添加 类型 tsconfig.json "paths" 列表,但这可能会让其他开始使用您的应用程序的ember cli typescript用户感到惊讶!