从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)中打开以使其更严格它可能是有用的。
JavaScript和TypeScript中有两种类型的源文件:脚本和模块。
我引用the handbook:
在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级
import
或export
的文件都被视为模块。相反,没有任何顶级import
或export
声明的文件被视为脚本,其内容在全局范围内可用(因此也可用于模块)。
例如,您可以将文件ClassToBeImported.js
加载到网页中的<script>
标记中,然后ClassToBeImported
类将作为全局变量提供。