为什么引用非导出类不会产生转换错误?

问题描述 投票:0回答:1

从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)中打开以使其更严格它可能是有用的。

typescript ecmascript-6 module tsc tsconfig
1个回答
0
投票

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

我引用the handbook

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

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

© www.soinside.com 2019 - 2024. All rights reserved.