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