从Java的背景来看,我对Typescript和Javascript(以及node.js)都比较陌生,但是很快就学会了痛苦的方法。我最近从一个包含多个类的巨型Typescript文件转换为使用多个类。这需要进行一些研究,我并没有声称要完全了解2种以上不同的Javascript导入系统。但是我使用的是import {ClassName} from './{Classname}'
语法,并确保Classname
以export class ClassName
开头。最初效果很好。特别是,由于Java的背景并且依赖于编译器错误,我感谢Netbeans将在我的导入中检测到错误,并且tsc
同意。添加导入,然后重试,一切都变得合理了。
直到它停止工作,即不会由错误(?)代码生成任何错误。在运行时,我得到了ReferenceError: ClassToBeImportedis not defined
。当然,ClassToBeImported
没有被导入。我希望添加import {ClassToBeImported} from './{ClassToBeImported}
可以解决该问题。 (我是对的吗?在这种情况下,比测试更容易回答。)令我困扰的是这一次是运行时错误,而不是IDE /编译器错误。
在尝试提出一个最小的示例时,我认为问题是未导出引用的文件。如果我从export
添加/删除export class NeedsToBeImported
,该错误就会重复出现/继续。
这将产生错误(Cannot find name 'ClassToBeImported'.
):
// in file MainClass.ts
export class MainClass{
constructor(){
let x = ClassToBeImported.SOME_FIELD;
}
}
// in file ClassToBeImported.ts, same folder
export class ClassToBeImported{
static SOME_FIELD : string = "data";
}
这要等到运行时:
// in file MainClass.ts
export class MainClass{
constructor(){
let x = ClassToBeImported.SOME_FIELD;
}
}
// in file ClassToBeImported.ts, same folder
class ClassToBeImported{
static SOME_FIELD : string = "data";
}
所以主要问题是到底发生了什么。 (“为什么引用未导出的类不会产生翻译错误?”)第二个问题是,是否有什么我可以做的以使我自己“更安全”。如果有一些选择,我可以在tsconfig.json
中启用(目前定位到es2015)以使其更加严格,这可能会很有用。
答案 0 :(得分:0)
JavaScript和TypeScript中有两种类型的源文件:脚本和模块。
我引用the handbook:
在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级
import
或export
的文件都被视为一个模块。相反,没有任何顶级import
或export
声明的文件将被视为脚本,其内容在全局范围内可用(因此也适用于模块)。
例如,您可以将文件ClassToBeImported.js
加载到网页中的<script>
标签中,然后ClassToBeImported
类将用作全局变量。