我有一个Typescript项目,它生成一个捆绑的.js库,用于客户端webapps。我正在使用命名空间和///引用。当库中的一个文件依赖于另一个文件并且没有///引用时,我想得到设计/构建时错误;否则,直到运行时才会被发现。
通过以下内容,我得到了一个很好的编译时错误:
// AClass.ts
namespace test {
export class AClass extends ZClass {
constructor() {
super();
}
}
}
...
// ZClass.ts
namespace test {
export class ZClass {
constructor() {
}
}
}
TSC构建按预期抱怨error TS2690: A class must be declared after its base class
,并按预期再次添加/// <reference path=’zclass.ts’
修复它。这就是我要找的。 p>
问题是当你实例化一个静态变量时,它似乎不会在构建时被捕获。例如,按如下方式更改上述代码:
// AClass.ts
namespace test {
export class AClass {
static z = new ZClass();
constructor() {
}
}
}
...
// ZClass.ts
namespace test {
export class ZClass {
constructor() {
}
}
}
现在编译时,不会发出构建错误;但是当你运行时,得到"test.AClass is not a constructor"
,因为在捆绑的.js文件中此时没有定义ZClass;该定义发生在AClass之后。如果切换对象名称,则可以正常工作。或者,如果您将/// <reference path="ZClass.ts"/>
添加到AClass.ts,它就可以。
在这种情况下,TSC是否可以输出构建错误?我担心的是很容易错过添加其中一个引用。
推论:使用模块和导入很好地解决了这个问题,但我遇到了这种方法的其他问题(在这个SO问题中讨论过:How to structure Typescript library code to generate d.ts file that can be used by Typescript app?),所以我正在探索是否可以使命名空间工作这里。