4

基本上,我想为从 ts 文件访问的 AMD js 模块定义一个接口。问题是 ts 中的模块导入不会返回通常在 AMD js 模块中定义和返回的匿名类。所以我不能使用'new'来实例化它们。

我有一个 AMD 模块(它是包的主文件,我在其他模块中将其称为“a/main”),如下所示:

main.js

define(function(){   
  var a=function(){...}; //constructor
  a.prototype={...};//body   

  return a;
});

为了在打字稿中使用 a/main,我创建了adts,其中 a 的定义如下:

declare module "a/main"{
    //I don't know how to writ this part... 
}

然后我有一个打字稿文件,我想在其中使用:

其他文件.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 文件是最后一个采取。

4

3 回答 3

1

您对 main 的定义可以包括 a 的类:

declare module "a/main" {
    class a {
        exampleFunction(name: string) : void;
    }
}

我添加了一个示例函数来表明,当您使用 declare 关键字时,您不需要任何实现 - 只需方法签名。

这是使用此声明的示例。

import main = module("a/main");
var x = new main.a();
于 2013-04-09T06:58:53.837 回答
1

您可能需要 TypeScript 0.9.1 才能使此解决方案起作用:

a.js(你称它为 main.js)

define(function(){   
  var a=function(){...}; //constructor
  a.prototype={...};//body   

  return a;
});

adts(放在 a.js 旁边):

declare class ClassA {
    // members of a ...
    toString():string;  // for example
}

declare var classA:typeof iModuleA;
export = classA;

其他文件.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();
于 2013-10-11T17:02:45.963 回答
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 
});
于 2013-04-09T01:45:09.317 回答