打字稿子命名空间和环境模块

时间:2016-03-29 14:45:18

标签: javascript typescript namespaces

我有一个难题。我对Typescript很新,但到目前为止,我一直很享受这段经历。想要成为一名优秀的开发人员,并将我的模块逻辑分组到名称空间中,我遇到了罕见的问题。这是重新创建问题的最简单示例。

假设您有一个类...我们将其称为ClassA,它引用一个名为ClassB的类,它位于子命名空间中。

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

        }
    }
}

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

        }
    }
}

打字稿对此并不高兴。好吧,当我想为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() {

        }
    }
}

突然间,打字稿会失忆,并且不知道Bar是什么。它不识别子命名空间。我已经尝试了几种方法让它记住像嵌套命名空间或导出它们,但没有什么能让它识别出来。什么是哟哟?你们中的任何一个很酷的猫知道发生了什么,或者我如何解决它并保留我的孩子命名空间?

1 个答案:

答案 0 :(得分:2)

  

突然间,打字稿会失忆,不知道Bar是什么。它无法识别子名称空间。我已经尝试了几种方法让它记住像嵌套命名空间或导出它们,但没有什么能让它识别出来。什么是哟哟

因为名称空间全球模块模块化。因此,只要将模块导入文件,就会将文件变为模块https://basarat.gitbooks.io/typescript/content/docs/project/modules.html

建议

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