【问题标题】:How to import a js library without definition file in typescript file如何在打字稿文件中导入没有定义文件的js库
【发布时间】:2014-05-15 13:29:52
【问题描述】:

随着我们的项目越来越大,我想从 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');

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

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

Unable to resolve external module ''lib/errorInfoHandler'' 
Module cannot be aliased to a non-module type.

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

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

}

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

【问题讨论】:

    标签: javascript requirejs typescript


    【解决方案1】:

    lib 中创建一个名为errorInfoHandler.d.ts 的文件。在那里,写:

    var noTypeInfoYet: any; // any var name here really
    export = noTypeInfoYet;
    

    现在alert 导入将成功并且是any 类型。

    【讨论】:

    • 感谢您的信息。但是它仍然抛出错误`无法解析外部模块`我需要在import require语句中添加带有扩展名的js文件的路径吗?
    • 在第一行 var 之前需要一个 declare 才能工作
    【解决方案2】:

    创建您自己的包含以下内容的定义文件:

    declare module "lib/errorInfoHandler" {}
    

    并在您要使用导入的地方引用此文件。

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

    /// <amd-dependency path="lib/errorInfoHandler">
    

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

    【讨论】:

      【解决方案3】:

      此处给出的 2 个答案的组合对我有用。

      //errorInfoHandler.d.ts
      declare module "lib/errorInfoHandler" {
         var noTypeInfoYet: any; // any var name here really
         export = noTypeInfoYet;
      }
      

      我还是 TypeScript 的新手,但看起来这只是通过导出一个没有类型信息的虚拟变量来告诉 TypeScript 停止的一种方式。

      编辑

      在此答案的 cmets 中已指出,您只需声明即可获得相同的结果:

      //errorInfoHandler.d.ts
      declare module "*";
      

      见github评论here

      【讨论】:

      • 您可以跳过declare module 部分,您只需在var 之前添加声明
      • 根据this comment on GitHubdeclare module "*"就够了。
      • 是的 - 只需按照@gronostaj 使用这个最小声明。
      • 注意'declare module "module-name";'将只允许此模块没有类型,而 '*' 将声明所有模块具有更多类型。我们更喜欢前者,因为我们可以根据具体情况确定哪些模块没有类型。
      【解决方案4】:

      通常,如果您只需要 temporary-faster-solution,可以通过在项目文件夹的根目录中定义一个新的 index.d.ts 来完成,然后像描述的那样创建一个模块名称在package.json 文件内

      例如

      // somefile.ts
      import Foo from '@awesome/my-module'
      
      // index.d.ts on @awesome/my-module
      declare module '@awesome/my-module' {
        const bind: any;
        export default bind;
      }
      

      【讨论】:

        【解决方案5】:

        在 2020 年遇到了这个问题,并找到了一个简单的解决方案:

        1. 在您的 TS 项目的根目录中创建一个 decs.d.ts 文件。

        2. 放置此声明:

          declare module 'lib/errorInfoHandler';
          

        这消除了我的错误。我正在使用 TypeScript 3.9.7

        【讨论】:

          猜你喜欢
          • 2017-12-10
          • 2017-07-06
          • 2023-01-26
          • 2022-06-14
          • 1970-01-01
          • 2023-04-10
          • 2018-01-19
          • 2021-02-17
          • 2017-10-22
          相关资源
          最近更新 更多