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

注意

我不了解有关将名称空间的类拆分到多个文件中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和imports进行变体使我失败了。

如果有关系,我还将使用嵌套的名称空间,其中成员是在子目录中定义的。我一直在使用相对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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

'声明-A x'与'声明-A x =()'

错误迁移:无法声明类 X,因为名称已被使用

在C ++中,X x = X()有什么区别?类型声明和X x; 声明X是类

错误:应该在名为X.java的文件中声明X类是公共的

从2.7.x升级到2.8.x后出现TypeScript错误TS2349

定义我的类 X 时在类 X 中声明类型 X 的变量

错误:未声明的名称空间前缀x:

角度错误 TS2341:属性“X”是私有的,只能在类中访问

x的多个声明

无法在X.ts中确定类X的模块!将X添加到NgModule以修复ionic2中的错误

使用Typescript类型错误反应“自定义挂钩”“类型'interface |(({{target}:any)=> void)'。ts(2339)上不存在属性'x'

变量X在声明之前已被使用

sql选择前X到X + N

R删除行的前x后x%

#定义ADD(x)(x)+(x)返回错误结果

X不是类模板

错误肯定的“词法声明需要ECMAScript 6”和“ TypeScript 1.x功能。当前语言为1.4”错误消息

使用扩展语法传递参数的打字稿会抛出“预期 x 参数,但得到 x 或更多。” 错误 (TS2556)

来自后端的 X 错误

什么是未使用的参数的“更好”:(x = x)或(void(x))?

如何使用“ x <= y && x> = y && x!= y”使循环无限?

函数参数中未使用的'x',但需要'x'-JSLint错误

如何声明QPoint(x,y)

使用VBA从文本插入前x行

错误:Size(XX) 必须匹配形状 x,x,x,x 的乘积

何时使用x:Object?

使用iPhone X的bottomNavigationBar

使用python解决x

对x值使用函数