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)
这是怎么回事?我该如何解决?
这是因为ember-cli-typescripttypes
未包含该模块进行编译。纯类型声明可以正常工作,因为它们在编译时被删除。然而,枚举具有运行时表示,而不仅仅是编译时表示\xe2\x80\x94 ,这与 TypeScript 中的几乎所有其他内容不同!(有时您可以使用const enum
类型来解决这个问题,但它们有自己的权衡。)
无论如何,因为 ember-cli-typescript 默认情况下不包含用于types
编译的目录\xe2\x80\x94,仅用于类型解析\xe2\x80\x94,结果是您可以使用枚举作为类型,但您不能不使用它们来实际创造价值,这在很大程度上违背了这一点。
最好的做法是保留your-app/types/
仅声明应用程序外部存在的类型的内容,或者应用程序中没有运行时表示的常见类型,并将具有与之关联的运行时功能的类型放在诸如your-app/app/lib
. 然后,您可以从任何模块导出类型,并像平常一样在整个应用程序中重用它们。
或者,您可以添加types
到tsconfig.json
\ 的"paths"
列表中,但这可能会让其他开始使用您的应用程序的 ember-cli-typescript 用户感到惊讶!
归档时间: |
|
查看次数: |
278 次 |
最近记录: |