在TypeScript中使用import/require获取接口声明

8
如果我使用/// <reference path="..."/>语法引用一个TypeScript声明文件(例如jquery.d.ts),那么我需要通过其他方式加载相应的库,只是引用.d.ts文件并不能加载库。
有没有一种方法可以让TypeScript在使用时生成一个require()调用来加载库?如果我不使用AMD/requirejs,我可以手动调用require,但我想让它与AMD一起工作。
这样做的好处是我的依赖关系不会在两个地方定义。从.ts文件中引用库就足以确保它被加载,而不必在HTML中手动维护依赖项列表。
更新:我打开了一个new question,澄清了我的确切情况。由于我没有提供所有必要的细节,因此我想为原始问题的答案给予信用。
2个回答

7
是的,TypeScript支持“外部”模块,这些模块基本上是一流的AMD或CommonJS模块。例如:
MyLib.ts
export function foo() { return 'bar' }

MyProj.ts

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

使用"--module amd"编译它,将为您生成适当的模块和require语法。

1
模块非常适用于直接提供函数和变量的库,但我需要类似于jQuery插件这样扩展现有功能的库。在这些库中没有要导出的内容,但加载它们会在JQuery接口(在jquery.d.ts中定义)上添加额外的调用。 - dcstraw
说实话,我认为你的回答确实适用于我的原始问题。只是我没有完全明确我的问题。我会将其标记为答案并提出更清晰的问题。 - dcstraw

1

我在我的博客上写了一些关于这个的内容。你也可以在GitHub上找到一个例子。

解决方案比较复杂,但基本上我使用Require.JS中的shims来定义表示我想要加载的Javascript库的模块名称。然后,我创建一个与该名称相同的TypeScript文件,以使TypeScript编译器生成可以使用我想要的JS库的Javascript代码。这样说可能不太清楚,但请阅读文章,我认为它会更有意义。


d.ts文件仅由Typescript用于确定您的代码是否正确类型化。基本上它只是一个接口,因此Typescript编译器不会生成任何代码。您必须以某种方式提供Javascript库的实现。一种解决方案是在html中引用Javascript文件,就像您不想做的那样。另一种解决方案是使用AMD异步加载它。这是我提出的解决方案。 - Absolom
明白了,但我仍然认为你的解决方案因为垫片而不必要地复杂。 - dcstraw
为什么不直接执行 import underscore = module('libs/underscore'); 并拥有一个 libs/underscore.d.ts 文件呢?这样 TypeScript 就能找到声明并且生成的代码会加载 underscore,而无需定义任何别名。此外,我假设您正在使用支持 AMD 样式加载的旧版本 underscore。最新版本似乎只支持全局 '_'。 - dcstraw
不,我正在使用最新版本的Underscore版本,而不是AMD风格的加载。这就是为什么我使用shim“hack”的原因。但好处是,使用您的库的开发人员只需要在其html中引用'require.js'。他们不必引用您的Typescript所引用的所有“本地”库,如JQuery、Underscore、Sylvester等。您可以在GitHub上查看一个小例子,以了解其运作方式。 - Absolom
谢谢你的解释。我现在明白了你的解决方案以及为什么要使用shims。然而,我不能使用这个方法的关键原因是jQuery插件没有顶级调用,所以我无法声明任何导出并让TypeScript在生成的代码中添加依赖项。 - dcstraw
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接