TypeScript错误TS2449:在声明前使用类'x'

Anm*_*Anm 8 typescript

我不了解有关将名称空间的类拆分到多个文件中的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',该声明处理了拆分为多个文件的模块。

Fen*_*ton 5

主要术语警报

命名空间不是优先于模块的。这是非常重要的一点。让我们深入历史...

命名空间以前是这样声明的:

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了子类以进行说明。您有疑问并没有完全做到这一点,但我想说明一下这个概念。该问题在名称空间中有两个具有相同名称的类,这是重复的名称冲突。