Typescript子命名空间和环境模块

Typescript Child Namespaces and Ambient Modules

本文关键字:环境 模块 命名空间 Typescript      更新时间:2023-09-26

我有一个难题要给你。我对打字还很陌生,但到目前为止我很享受这种体验。想要成为一名优秀的开发人员并将模块逻辑地分组到命名空间中,我遇到了一个罕见的问题。以下是重现问题的最简单示例。

假设你有一节课。。。我们将称之为ClassA,它引用了一个名为ClassB的类,该类位于子命名空间中。

namespace Foo {
    export class ClassA {
        public classB: Bar.ClassB;
        public constructor() {
        }
    }
}

namespace Foo.Bar {
    export class ClassB {
        public constructor() {
        }
    }
}

Typescript对此再高兴不过了。当我想为ClassA导入东西时,我会把它放在命名空间中,如下所示:

namespace Foo {
    import SomeClass = SomewhereElse.SomeClass;
    export class ClassA {
        public classB: Bar.ClassB;
        public constructor() {
        }
    }
}

再次。。。我们冷静下来。但是如果我想导入一个环境模块呢?

namespace Foo {
    import * as SockJS from "sockjs-client"; // TS1147 GRUMBLE! CAN'T DO DAT HERE!
    export class ClassA {
        public classB: Bar.ClassB;
        public constructor() {
        }
    }
}

好的,没关系。我会像它告诉我的那样把它移到命名空间之外。

import * as SockJS from "sockjs-client";
namespace Foo {
    export class ClassA {
        public classB: Bar.ClassB; // TS2503:Now you're just a Bar that I used to know
        public constructor() {
        }
    }
}

Typescript突然失忆,不知道Bar是什么。它无法识别子命名空间。我已经尝试了几种方法来让它记住,比如嵌套名称空间或导出它们,但没有什么能让它识别这一点。dilly yo是什么?你们中的任何一个酷猫都知道发生了什么,或者我如何解决它并保留我的孩子名称空间?

Typescript突然失忆,不知道Bar是什么。它无法识别子命名空间。我已经尝试了几种方法来让它记住,比如嵌套名称空间或导出它们,但没有什么能让它识别这一点。什么是dilly yo

这是因为命名空间全局。并且模块。因此,一旦您将模块导入到文件中,您的文件就会成为模块。https://basarat.gitbooks.io/typescript/content/docs/project/modules.html

建议

请使用模块。原因有很多:https://github.com/TypeStrong/atom-typescript/blob/8d43dd1b930a6df0ce62454a1560acfb7eee24c9/docs/out.md