导入名称空间,因此不使用前缀

时间:2016-08-07 00:04:27

标签: javascript typescript

我有一个位于名称空间的库,有点像这样:

namespace MyLib {
    export class MyClass {}
}

然后我有另一个不在命名空间中的类,如下所示:

class Test extends MyLib.MyClass {}

我是否可以在不必为命名空间添加前缀的情况下访问MyClass?也许是这样的:

import MyLib;

class Test extends MyClass {}

修改

我发现我可以这样做:

import MyClass = MyLib.MyClass;

哪个没关系,但基于这个我还是要导入名称空间中的所有类?

1 个答案:

答案 0 :(得分:0)

命名空间约定是一种doesn't translate very well to JavaScript的C#形式。我的建议是完全停止使用它,因为它会比解决实际问题引起更多的头痛。

相反,您应该将模块本身视为名称空间“事物”。您可以这样做:

// MyLib.ts
class MyClassA {}
class MyClassB {}
export {
    MyClassA,
    MyClassB,
};

// Your code
import { MyClassA, MyClassB } from "./MyLib.ts";

或在单独的文件中

// MyClassA.ts
export class MyClassA {}

// MyClassB.ts
export class MyClassB {}

// MyLib.ts
import MyClassA from "./MyClassA";
import MyClassB from "./MyClassB";
export {
    MyClassA,
    MyClassB,
};

// Your code
import { MyClassA, MyClassB } from "./MyLib.ts";

但是,您不能“导入所有名称”,而不能像在C#中那样用魔法来限制事物的范围。需要以某种方式声明它们。在您的示例代码上,没有办法说出Test来自MyLib-实际上,即使您可以使它起作用(通过全局变量,例如window.Test = Test),TypeScript也不会对此感到很高兴,因为它找不到Test的定义,您需要在某处declare var对其进行定义。