2012-10-19 61 views
8

如果我使用/// <reference path="..."/>语法引用TypeScript声明文件(例如jquery.d.ts),那么我需要确保通过其他方式加载相应的库,即只引用.d.ts文件不会加载库。在TypeScript中使用import/require来获取接口声明

当我使用它时,有什么方法可以使TypeScript为库生成一个require()调用?如果我没有使用AMD/requirejs,我可以手动拨打require,但我想让它与AMD合作。

这样做的好处是我的依赖不会在两个地方定义。从.ts文件引用库足以确保加载,而不必在我的HTML中手动维护依赖列表。

更新:我打开了一个new question,阐明了我的确切情况。因为我没有提供所有必要的细节,所以我想给出我原来的问题的答案。

回答

6

是的,TypeScript支持“外部”模块,它基本上是一流的AMD或CommonJS模块。例如:

MyLib.ts

export function foo() { return 'bar' } 

MyProj.ts

import lib = module('./MyLib.ts') 
lib.foo(); // returns bar 

与 “--module AMD” 编译这一点,你会得到适当的模块,需要为你生成语法。

+1

模块对于直接提供函数和变量的库非常适用,但我需要类似的库来扩展jQuery插件等现有功能。没有什么可以导出,但加载它们会在JQuery界面上添加额外的调用(在jquery.d.ts中定义) – dcstraw

+0

公平地说,我认为你的答案适用于我原来的问题。我只是没有完全指定我的问题。我会将其标记为答案并提出更清晰的问题。 – dcstraw

1

我写了something关于我的博客。您还可以在GitHub上找到示例。

该解决方案需要很长时间才能解释,但基本上我使用带有Require.JS的垫片来定义表示要加载的Javascript库的模块名称。然后我创建一个具有相同名称的TypeScript文件,以使TypeScript编译器生成可以使用我想要的JS库的Javascript代码。这不是真的有意义,但请阅读这篇文章,我认为它会更有意义。

+0

感谢您的回复。不过,我认为这不能解决我的问题。该解决方案仍假定库至少有一个顶级调用,以便TypeScript将在'define'调用中生成依赖关系。我没有任何顶级方法或变量,因为这些库是扩展现有功能的插件。 另外我不认为你真的需要在你的例子中使用垫片。如果您只需在underscore.js旁边创建underscore.d.ts,则可以导入'libs/underscore'模块,TypeScript将使用.d.ts文件。 – dcstraw

+0

d.ts文件仅由Typescript用于确定您的代码是否正确键入。基本上它只是一个接口,所以没有代码由Typescript编译器生成。您必须以某种方式提供Javascript库的实现。一种解决方法是在HTML中引用Javascript文件,就像你不想做的那样。另一个解决方案是使用AMD异步加载它。这是我提出的解决方案。 – Absolom

+0

了解,但我仍然认为你的解决方案由于垫片而不必要的复杂。 – dcstraw