为名称空间

时间:2016-03-15 07:22:31

标签: javascript typescript

我正在将现有的JavaScript应用程序转换为Typescript。我从:

开始
// file1.js
(function(ns) {
  ns.bar = function() { };
}(window.MyNamespace || {}));
// file2.js
(function(ns) {
  ns.Item = function() {
    this.doStuff = function() { ns.bar(); };
  }
}(window.MyNamespace || {}));

现在我正在将file2.js转换为TypeScript:

module MyNamespace {
  class Item {
    doStuff() {
      MyNamespace.bar(); // This is obviously a problem
    }
  }
}

调用bar时出现问题。我知道将file1.js转换为TypeScript会使事情变得更容易,但实际上该文件非常大,所以我想在下一个sprint进行转换并获得中间情况。

我该如何解决?如何告诉tsc bar是模块本身的函数

我在declare var bar: () => void;及其变体中尝试了module,但到目前为止还没有让它发挥作用。

我知道我可以考虑将这些“命名空间函数”转换为类上的静态方法,但这需要重写file1.js now ,这是我不想要的(还是)

我有这样的解决方法

module MyNamespace {
  var ns: any = MyNamespace;

  class Item {
    doStuff() {
      ns.bar();
    }
  }
}

但是感觉有点偏差,至少因为它需要在我的class 内部进行更改,而我更希望在file2.ts和{之间建立一座桥梁{1}}与最终的file1.ts内容分开。

从本质上讲,我觉得我正在编写一个file2.ts文件,用于我原来的.d.ts功能,这将使file1.js以某种方式 工作file2.ts转换为file1.js后可以保持不变。

任何提示?如何为未转换的.ts创建输入?

1 个答案:

答案 0 :(得分:1)

向模块添加声明语句 next ,如下所示:

declare module MyNamespace {
    var bar: () => void;
}

module MyNamespace {
  class Item {
    doStuff() {
      MyNamespace.bar(); // This will compile!
    }
  }
}

一旦您将file1.js转换为Typescript

,您就可以(应该)删除bar方法的临时声明