为什么引用未导出的类不会产生翻译错误?

时间:2019-04-09 06:27:02

标签: typescript ecmascript-6 module tsc tsconfig

从Java的背景来看,我对Typescript和Javascript(以及node.js)都比较陌生,但是很快就学会了痛苦的方法。我最近从一个包含多个类的巨型Typescript文件转换为使用多个类。这需要进行一些研究,我并没有声称要完全了解2种以上不同的Javascript导入系统。但是我使用的是import {ClassName} from './{Classname}'语法,并确保Classnameexport 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)以使其更加严格,这可能会很有用。

1 个答案:

答案 0 :(得分:0)

JavaScript和TypeScript中有两种类型的源文件:脚本模块

我引用the handbook

  

在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级importexport的文件都被视为一个模块。相反,没有任何顶级importexport声明的文件将被视为脚本,其内容在全局范围内可用(因此也适用于模块)。

例如,您可以将文件ClassToBeImported.js加载到网页中的<script>标签中,然后ClassToBeImported类将用作全局变量。