如何在typescript文件中导入没有定义文件的js库

tun*_*2fs 60 javascript requirejs typescript

随着项目变得越来越大,我想从JavaScript切换到TypeScript以帮助进行代码管理.然而,我们使用许多库作为amd模块,我们不想将其转换为TypeScript.

我们仍然希望将它们导入TypeScript文件,但我们也不想生成定义文件.我们怎样才能做到这一点?

例如新的Typescript文件:

/// <reference path="../../../../definetelyTyped/jquery.d.ts" />
/// <reference path="../../../../definetelyTyped/require.d.ts" />
import $ = require('jquery');
import alert = require('lib/errorInfoHandler');
Run Code Online (Sandbox Code Playgroud)

lib/errorInfoHandler是一个amd模块,包含在我们不想触及的巨大JavaScript库中.

使用上面的代码会产生以下错误:

Unable to resolve external module ''lib/errorInfoHandler'' 
Module cannot be aliased to a non-module type.
Run Code Online (Sandbox Code Playgroud)

这实际上应该产生以下代码:

define(["require", "exports", "jquery", "lib/errorInfoHandler"], function(require, exports, $, alert) {
...

}
Run Code Online (Sandbox Code Playgroud)

有没有办法将JavaScript库作为amd模块导入TypeScript,并在TypeScript文件中使用它而不制作定义文件?

Cod*_*ate 25

这里给出的2个答案的组合对我有用.

//errorInfoHandler.d.ts
declare module "lib/errorInfoHandler" {
   var noTypeInfoYet: any; // any var name here really
   export = noTypeInfoYet;
}
Run Code Online (Sandbox Code Playgroud)

我还是TypeScript的新手,但看起来这只是一种告诉TypeScript通过导出一个没有类型信息的虚拟变量而离开的方法.

编辑

在这个答案的评论中已经注意到,通过简单地声明,您可以获得相同的结果:

//errorInfoHandler.d.ts
declare module "*";
Run Code Online (Sandbox Code Playgroud)

请在此处查看github评论.

  • 您可以跳过`declare module`部分,只需在`var`之前添加声明 (4认同)
  • 注意'declare module'module-name";' 将只允许此模块没有类型,而'*'将声明所有模块具有更多类型.我们更喜欢前者,因为我们可以根据具体情况确定哪些模块没有类型. (3认同)
  • 根据 [GitHub 上的此评论](https://github.com/Microsoft/TypeScript/issues/13348#issuecomment-282388407)`声明模块“*”`就足够了。 (2认同)

tho*_*aux 5

使用以下内容创建您自己的定义文件:

declare module "lib/errorInfoHandler" {}
Run Code Online (Sandbox Code Playgroud)

并在要使用导入的位置引用此文件。

或者将以下行添加到文件顶部:

/// <amd-dependency path="lib/errorInfoHandler">
Run Code Online (Sandbox Code Playgroud)

注意:我不知道后者是否仍然有效,这就是我最初处理缺失的 AMD 依赖项的方式。另请注意,使用此方法您将无法获得该文件的 IntelliSense。