我有一个问题,Typescript编译器成功编译我的代码,但运行时给了我未定义的类型错误.
在我的应用中,我创建了一个types.ts文件,其中包含多个其他ts文件之间共享的内容 它包含一个字符串枚举,如:
enum MyEnum {
One = "one";
Two = "two";
}
Run Code Online (Sandbox Code Playgroud)
当我这样定义它.编译器让我在其他ts文件中使用它,看起来很开心.但是,在运行时我收到错误"MyEnum未定义".
我知道有两种方法可以解决这个问题:
我对Typescript很新,我觉得我可能误解了一些基本的东西.
首先,我不明白为什么如果会出现运行时错误,Typescript编译器会愉快地编译我的代码.我会理解它,如果我使用了declare关键字,告诉编译器在运行时应该有什么东西可用,但在这种情况下我不明白为什么它应该假设枚举来自除了types.ts文件以外的任何地方.
其次,我想在我的应用程序中全局定义类型,并让它们在任何地方都可用,而不必在每次使用它们时都导入它们.我该如何做到这一点?或者这可能被认为是不好的做法?
我使用的是Typescript 2.6,我的配置如下所示:
{
"compilerOptions": {
/* Basic Options */
"target": "es6",
"module": "commonjs",
"lib": ["es6", "es7", "esnext"],
"sourceMap": true /* Generates corresponding '.map' file. */,
"outDir": "build" /* Redirect output structure to the directory. */,
"removeComments": true /* Do not emit comments to output. */,
/* Strict Type-Checking Options */
"strict": true /* Enable all strict type-checking options. */,
/* Additional Checks */
"noUnusedLocals": true /* Report errors on unused locals. */,
"noUnusedParameters": true /* Report errors on unused parameters. */,
"noImplicitReturns": true /* Report error when not all code paths in function return a value. */,
"noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */,
"plugins": [{ "name": "tslint-language-service" }],
"skipLibCheck": true // because firebase-sdk has wrong type files now (Nov 18)
},
"include": ["src/**/*"],
"exclude": ["build"]
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*t B 18
还有另一种方法可以做到这一点.如果您不想导出枚举,可以将其定义为const枚举
const enum MyEnum {
One = "one";
Two = "two";
}
Run Code Online (Sandbox Code Playgroud)
这些内容由编译器内联,并在编译期间完全删除.
小智 13
我遇到这个问题是因为我使用了声明
export declare enum SomeEnum
Run Code Online (Sandbox Code Playgroud)
代替
export enum SomeEnum
Run Code Online (Sandbox Code Playgroud)
Chi*_*tsu 10
导入重新导出枚举时,我遇到了同样的问题。它导致运行时错误。
布局.ts
export enum Part { Column, Row }
Run Code Online (Sandbox Code Playgroud)
索引.ts
export * from './layout'
Run Code Online (Sandbox Code Playgroud)
组件.ts
import { Part } from '../entities' // This causes error
import { Part } from '../entities/layout' // This works
Run Code Online (Sandbox Code Playgroud)
以我的undefinedenum为例,事实证明是由于循环导入:
export enum A {...}在文件a.ts中export const b = ...定义,在文件中
定义b.ts;
import {A} from './a.ts'在b.ts,而import {b} from './b.ts'在a.ts。
删除循环导入后,该错误消失了。
| 归档时间: |
|
| 查看次数: |
11452 次 |
| 最近记录: |