Roy*_*hal 6 javascript typescript
我正在通过在编译器选项中指定 outFile 将我的 TypeScript 项目编译成单个 JS 文件。在我的项目中,每个类都在不同的文件中定义。
问题是相互依赖的类没有按照正确的顺序连接到输出 JS 中。
例如,如果我的 A 类扩展了 B 类,则意味着 B 类必须在 A 类之前编译。
(1)
class A extends B { } //error - can't find B
class B { }
Run Code Online (Sandbox Code Playgroud)
(2)
class B { }
class A extends B { } //works as expected
Run Code Online (Sandbox Code Playgroud)
问题是 TypeScript compile 中的文件顺序没有按照类的依赖关系定义,导致出现很多(1)的情况。
可以通过手动定义多行编译顺序来解决:
/// <reference path="myFile.ts"/>
Run Code Online (Sandbox Code Playgroud)
然而,它并不理想,并且在大型项目中很快就会成为一个令人头疼的问题。
我读到的另一个选项是使用外部模块并能够要求/导入相关的类/文件。
这听起来不错,但它似乎只在每个 ts 文件被编译成自己的 js 文件后,在所需文件的运行时才处理异步加载。
我需要的是在从 ts 到 js 的编译期间根据类依赖关系定义正确的编译顺序。
我在谷歌上搜索了“打字稿编译顺序”并通读了前 10 个结果 - 意思是遵循对 turoials、文档、视频等的引用......
似乎人们一直在遇到同样的问题,但他们的问题从未得到满意的回答。
根据我的理解,应该可以使用 CommonJS 外部模块,但我从答案中只能理解应该发生什么的一般意义,而不是关于如何实际操作的简单直接的答案。
如果你知道答案,让我们一劳永逸地解决这个问题:)
这不是 TypeScript 的问题,而是 ECMAScript 的问题:类没有被提升。
\n\n\n\n\n\n\n函数声明被提升:进入作用域时,在其中声明的函数立即可用 \xe2\x80\x93,无论声明发生在何处。这意味着您可以调用稍后声明的函数:
\n\nRun Code Online (Sandbox Code Playgroud)\n\nfoo(); // works, because `foo` is hoisted\n\nfunction foo() {}\n
相反,类声明不会被提升。因此,类仅在执行达到其定义并被评估后才存在。预先访问它会导致引用错误:
\n\nRun Code Online (Sandbox Code Playgroud)\nnew Foo(); // ReferenceError\n\nclass Foo {}\n
你必须注意订单。
\n\n\xe2\x80\xa6 或使用带有 ES6 模块的捆绑器 (Webpack) 或加载器 (SystemJS)。
\n