我的 Typescript / Ember 3.1 应用程序中有一个枚举,并且在运行时出现导入错误。这是怎么回事?

pba*_*nka 5 ember.js typescript

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

import { StateNames, CardSummary } from '../../types/snowcat/state-types'
Run Code Online (Sandbox Code Playgroud)

类型文件如下:

export enum CardState {
  error = 'error',
  new = 'new',
  okay = 'okay',
  warning = 'warning',
}
Run Code Online (Sandbox Code Playgroud)

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

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

代码看起来一切正常。我没有得到任何打字稿错误代码时建立的,但我得到一个运行时错误:

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)
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我该如何解决?

Chr*_*cho 5

这是因为ember-cli-typescripttypes未包含该模块进行编译。纯类型声明可以正常工作,因为它们在编译时被删除。然而,枚举具有运行时表示,而不仅仅是编译时表示\xe2\x80\x94 ,这与 TypeScript 中的几乎所有其他内容不同!(有时您可以使用const enum类型来解决这个问题,但它们有自己的权衡。)

\n\n

无论如何,因为 ember-cli-typescript 默认情况下不包含用于types编译的目录\xe2\x80\x94,仅用于类型解析\xe2\x80\x94,结果是您可以使用枚举作为类型,您不能不使用它们来实际创造价值,这在很大程度上违背了这一点。

\n\n

最好的做法是保留your-app/types/仅声明应用程序外部存在的类型的内容,或者应用程序中没有运行时表示的常见类型,并将具有与之关联的运行时功能的类型放在诸如your-app/app/lib. 然后,您可以从任何模块导出类型,并像平常一样在整个应用程序中重用它们。

\n\n

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

\n