在我们已经存在的代码库中,我们使用JavaScript的“类是函数和函数是对象”的方面来进行命名空间。
例如,假设我们有一个名为Foo的类,它包含一个名为Bar的类。
Foo是一个全局导出的对象(即,它存在于window.Foo中),而window.Foo.Bar是Bar的构造函数。(我认为公平地说,这是一种常见的JavaScript模式)。
确实,此模式创建了一个定向依赖项。Foo必须在Bar之前加载。我们使用不符合AMD协议的异步模块加载器stealjs来完成这一任务。由于这个原因,我们不能使用类型记录的内置导入/导出AMD代码生成。至少,直到我们做了几个星期的苦差事才能将整个代码库移植到需求。
为了在TypeScript中匹配这种模式,我们讨论了一个名为Foo的类,以及一个名为Foo的模块。
class Foo {
/* Foo's properties */
}
module Foo {
export class Bar {
/* Bar's properties */
}
}这是合法的TypeScript,它编译成上面描述的JavaScript情况: Foo类对象将包含Bar类对象作为其"Bar“属性。Foo模块被称为与Foo类合并,Bar被称为内部类。
但是,如果我简单地将这两条语句分离到单独的文件中:
// Foo.ts
class Foo {
/* Foo's properties */
}
// Foo/Bar.ts
module Foo {
export class Bar {
/* Bar's properties */
}
}这不再是合法的TypeScript,也不编译。1
这对我们来说是个大问题,因为我们不会将所有内部类声明都放入一个文件中。据我所知,这其实是没有解决办法的。我们只需污染全局命名空间,不能将内部类与名称空间合并。
如果我们使用内置于导入/导出语义中的TS,那么这个问题就不会出现,但我们不会出现,因为上面描述的原因。将所有东西移植到requirejs上现在还没有摆在桌面上。考虑到我们的情况,您认为解决类-模块合并限制的最佳策略是什么?
发布于 2014-11-05 16:19:05
您可以切换到require.js AMD片在一次而不是重写所有的一切在一次。实际上,最简单的方法是依赖于类型记录的内置AMD支持,因为它自动化了许多您需要做的工作,而且TypeScript中的导出和导入语法非常容易使用。您没有在TypeScript中添加导出或导入语句的文件按当前的情况构建,使用导出/导入的文件成为它们的模块。这有一点学习曲线,因为您将需要添加一个需求配置,并开始使用require(['mytsamd'], function (mytsamd) { /* do stuff with mytsamd */ })模式(或将其转换为类似于Q.js的承诺)在需要引用AMD对象的非类型记录文件中。
https://stackoverflow.com/questions/24496134
复制相似问题