我遇到了一个问题,就是Typescript编译器可以成功编译我的代码,但在运行时却出现了未定义类型的错误。
在我的应用程序中,我创建了一个types.ts
文件,其中包含一些在多个其他ts文件之间共享的内容。 它包含一个字符串枚举,例如:
enum MyEnum {
One = "one";
Two = "two";
}
当我这样定义时,编译器允许我在其他ts文件中使用它,并且似乎很开心。然而,在运行时我会得到错误“未定义MyEnum”。
我知道两种解决方法:
- 在使用它的文件中定义枚举。但我认为这对于想要使用它的其他文件没有任何帮助。
- 在types.ts文件中使用“export”,并显式导入每个类型到它被使用的所有地方。
我对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"]
}
/// <reference path="RelativePathToTypeScriptFile/TypeScriptFile.ts"/>
来引用类和函数,并且它们都能正常工作。但是,出于某种原因,对于枚举类型却不起作用! - Matt Arnoldreference path
对枚举类型无效的评论;我忘记在 MVC 项目中的BundleConfig.cs
文件中引用生成的 JavaScript 文件了。这是导致问题的原因。 - Matt Arnold