基本上,我想为从一个ts文件访问的AMD js模块定义一个接口。问题是ts中的模块导入不会返回通常在AMD js模块中定义和返回的匿名类。所以我不能用'new'来实例化它们。
我有一个AMD模块(它是一个包的主文件,我在其他模块中将其称为'a / main'),如下所示:
main.js
define(function(){
var a=function(){...}; //constructor
a.prototype={...};//body
return a;
});
要在打字稿中使用/ main,我创建了 a.d.ts ,其中a的定义如下:
declare module "a/main"{
//I don't know how to writ this part...
}
然后我有一个打字稿文件,我想在其中使用:
otherfile.ts
///<reference path="a.d.ts"/>
import a=module("a/main"); //here a should refer to a inside the main.
//so I should be able to say:
var x=new a();
问题是模块不是新的。所以,var x = new a();不行。
您能否建议宣布“a / main”模块的最佳方式?
注意:我有很多文件,比如a.js,并且更喜欢找到一种方法来编写.d.ts文件,这样我就不需要更改所有的.js文件了,即,更改.js文件是最后的手段。
答案 0 :(得分:1)
您对main的定义可以包括以下类:
declare module "a/main" {
class a {
exampleFunction(name: string) : void;
}
}
我添加了一个示例函数来表明当你使用declare关键字时,你不需要任何实现 - 只需要方法签名。
这是使用此声明的示例。
import main = module("a/main");
var x = new main.a();
答案 1 :(得分:0)
如果要导入在js文件中定义的模块而不是typescript,则不应使用typescript模块导入语法。
而是简单地使用导入模块的标准AMD语法,就像在 otherfile.ts 中编写 Javascript 一样。但是,这将为您提供一个非强类型的变量。
更新示例:
require(["main.js"], function(main:any) {
//This function is called when main.js is loaded.
//the main argument will hold
//the module value for "/main".
var x=new main(); // what you wanted
});
答案 2 :(得分:0)
您可能需要TypeScript 0.9.1才能使此解决方案正常工作:
a.js (你称之为main.js)
define(function(){
var a=function(){...}; //constructor
a.prototype={...};//body
return a;
});
a.d.ts (放在a.js旁边):
declare class ClassA {
// members of a ...
toString():string; // for example
}
declare var classA:typeof iModuleA;
export = classA;
<强> otherfile.ts 强>
import a=require("a"); // at runtime, a.js is referenced while tsc takes a.d.ts
//so you should be able to say:
var x=new a();