我不了解有关将名称空间的类拆分到多个文件中的tsc
编译过程<reference>
。我正在使用模式:
src/base.ts
namespace MyNameSpace {
export class Base {
/** constructor, etc. */
}
}
src/subclass.ts
/// <reference path="./base.ts" />
namespace MyNameSpace {
export class Subclass {
/** constructor, etc. */
}
}
这个简单的例子有效。但是随着我在更多文件上使用该模式,我会定期收到错误消息TypeScript error TS2449: Class 'x' used before its declaration.
。
我们回到手动管理声明顺序(例如.c
/.h
文件)了吗?如果是这样,哪些工具将有助于回溯引用以发现错误?
我的目标是有一个管理组文件编译成一个单一的.js
和.d.ts
(另一打字稿库来使用)。对于这种情况是否有更好的解决方案?尝试使用Webpack和import
s进行变体使我失败了。
如果有关系,我还将使用嵌套的名称空间,其中成员是在子目录中定义的。我一直在使用相对reference
路径。
这与typescript非常相似,在声明之前引用了基本类型'xxxx',该类型涉及拆分为多个文件的模块。
命名空间不是优先于模块的。这是非常重要的一点。让我们深入了解历史...
命名空间以前是这样声明的:
module MyNamespace {
}
但是现在它们声明如下:
namespace MyNamespace {
}
在声明命名空间时,该namespace
关键字比旧module
关键字更可取。
用module
关键字替换的原因namespace
是人们将它们与“模块”混淆了。您会看到混乱的根源!现在,实际的 模块(即导出或导入某些内容的文件)实际上比名称空间好一点,这就是为什么到目前为止我将整个答案都花在了所有这些上。
考虑到这一点,您可以考虑使用模块。每个模块都为您提供了命名上下文,并使某些内容不在全局范围之内。您可以导入和导出,并且所有内容都应按预期工作(并且您仍然可以将其捆绑在一起)。
src / base.ts
export class Base {
}
src / subclass.ts
import * as Example from './subclass.ts';
export class Base extends Example.Base {
}
如果要坚持使用命名空间,则必须考虑到放置在命名空间中的所有内容(即使该命名空间分散在多个文件中)都有助于单个命名上下文...因此您必须以不同的方式命名子类。
src / base.ts
namespace MyNameSpace {
export class Base {
/** constructor, etc. */
}
}
src / subclass.ts
/// <reference path="./base.ts" />
namespace MyNameSpace {
export class Sub extends Base {
/** constructor, etc. */
}
}
因此,最终,您可以选择每个文件都有其命名上下文的模块(适当的外部模块),并且可以轻松避免命名冲突-或使用分隔符来避免每个命名空间都是单个命名上下文。
在可能的示例中,我已继承Base
了子类以进行说明。您有疑问并没有完全做到这一点,但我想说明一下这个概念。该问题在名称空间中有两个具有相同名称的类,这是重复的名称冲突。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句