正确导入命名空间

时间:2018-09-06 14:36:53

标签: typescript

如何使用与当前文件名称空间相同或不同的名称空间中的类?

目前,我有以下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类/组件放在同一个命名空间下,我应该做那么难吗?还是只删除导出名称空间部分,让每个导出类更容易访问?

1 个答案:

答案 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的建议选择名称空间或外部模块。