首页 > 解决方案 > 以正确的方式导入命名空间

问题描述

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

目前我有以下2个文件。类型A.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 因为两者都具有相同的命名空间?实际上,我仍然计划将大量差异类/组件放在同一个命名空间下,我应该这样做吗?或者只是删除导出命名空间部分,让每个导出类更容易访问?

标签: typescript

解决方案


就像任何其他类型的声明一样,如果两个具有相同名称的命名空间被定义在相同的范围内,则它们只是“相同的命名空间”:全局或相同的父命名空间或外部模块。在您的示例中,您有两个不同的命名空间,名为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 globalcan 仅包含声明,并且必须单独修补实现。您最好遵循 Cerberus 的建议来选择名称空间或外部模块。


推荐阅读