如何使用与当前文件名称空间相同或不同的名称空间中的类?
目前,我有以下2个文件。 TypeA.ts:
export namespace Game {
@ccclass
export class TypeA extends cc.Component {
protected onLoad(): void {
// do something
}
}}
TypeB.ts:
import * s from "some url";
export namespace Game {
@ccclass
export class TypeB extends s.Game.TypeA {
protected onLoad(): void {
// do something
}
}}
您可以看到导入部分,vscode表示预期为'as',但是目前我可以键入任何字符串,并且可以以某种方式工作。 而且TypeB的延伸部分看起来很丑且很长。
我如何才能使TypeB扩展TypeA,因为它们都具有相同的名称空间? 实际上,我仍然计划将大量的diff类/组件放在同一个命名空间下,我应该做那么难吗?还是只删除导出名称空间部分,让每个导出类更容易访问?
答案 0 :(得分:0)
就像任何其他类型的声明一样,具有相同名称的两个名称空间只有在相同范围内定义时才是“相同名称空间”:全局或相同的父名称空间或外部模块。在您的示例中,您有两个名为Game
的不同命名空间,每个模块中都有一个。如果要从两个模块添加到相同的名称空间,则可以在TypeA.ts中使用以下内容:
declare global {
namespace Game {
class TypeA extends cc.Component {
onLoad(): void;
}
}
}
Game.TypeA = <any>function(this: Game.TypeA) {
// constructor
};
Game.TypeA.prototype.onLoad = function() {
// do something
};
,以及在TypeB.ts中的类似情况。如您所见,这变得非常丑陋,因为declare global
只能包含声明,并且必须分别修补实现。您最好遵循Cerberus的建议选择名称空间或外部模块。