在多个TypeScript文件中声明和使用相同的命名空间

时间:2017-11-03 08:54:47

标签: typescript namespaces typescript-typings

我是TypeScript的新手,我遇到了在多个文件中使用相同命名空间的问题:

file model.ts

export namespace MyCompany {
   export class Model {
      ...
   }
}

file webviewer.ts

import { Model } from './model';

export namespace MyCompany {
   model : Model;
   export class WebViewer {
      use() : void {
         this.model = new Model();
         ...
      }
      ...
   }
}

file index.ts

import { WebViewer } from './webviewer';

let webviewer = new WebViewer();
webviewer.use();

我找不到任何关于如何在myCompany.WebViewer类中使用MyCompany.Model和在index.ts文件中使用MyCompany.WebViewer的文档。

下面的这个文档包含很多例子,但是当在同一个库的多个文件中声明和使用相同的名称空间时,它们都不会处理我的情况。

https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#110-namespaces

更新

现在我问自己是否可以在每个文件中使用命名空间。可能有一种方法可以使用.d.ts文件,其中类可以在命名空间内导出,所以以后库可以作为Acme.WebViewer等使用

3 个答案:

答案 0 :(得分:1)

命名空间的基本思想是避免命名冲突(如果你或你团队中的其他开发人员想要另一个Model类,并且不知道你的那个怎么办?)

随着模块的引入,命名空间变得有点过时,因为它们以更优雅的方式解决了问题。您可以执行以下操作并完全跳过命名空间:

model.ts

export class Model {
  // ...
}

webviewer.ts

import { Model } from './model';

export class WebViewer {
  private model: Model;
  use(): void {
    this.model = new Model();
  }
}

index.ts

import { WebViewer } from './webviewer';

let webviewer = new WebViewer();
webviewer.use();

答案 1 :(得分:0)

使用命名空间时,您可以省略import。从命名空间外部调用对象时,必须将其包含在调用中:let m = new MyCompany.Model()。你在webviewer中也有一个拼写错误(模型变量必须在类中声明)

model.ts

export namespace MyCompany {
   export class Model {
      ...
   }
}

webviewer.ts

export namespace MyCompany {
   export class WebViewer {
      model : Model;
      use() : void {
         this.model = new Model();
      }
   }
}

index.ts

let webviewer = new MyCompany.WebViewer();
webviewer.use();

答案 2 :(得分:0)

我想我了解您,我的朋友,您找到解决方案了吗? 我有js项目,我想移植到ts。 我有名称空间Presentation并尝试在另一个视图中使用一个视图

Presentation.User ---> Presentation.Profile

在用户界面中显示个人资料界面。

我能做的就是这个

import java.io.*;

public class Test {
    public static void main(String args[]) throws IOException {
        BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
        Box obj1 = new Box();
        MatchBox obj2 = new MatchBox();

        System.out.print("Please Enter Width: ");
        obj1.width = Integer.parseInt(read.readLine());
        System.out.print("Please Enter Height: ");
        obj1.height = Integer.parseInt(read.readLine());
        System.out.print("Please Enter Depth: ");
        obj1.depth = Integer.parseInt(read.readLine());

        obj1.getVolume();
        obj2.displayVolume();
    }
}

class Box {
    int width, height, depth, volume;

    void getVolume() {
        volume = width * height * depth;
    }
}

class MatchBox extends Box {
    void displayVolume() {
        System.out.println("The Volume of Box is: " + volume);
    }
}

并以此方式使用

export namespace Presentation{
   export class Profile{}
}

希望您找到了更好的方法