【问题标题】:Generating typescript declaration files from javascript从 javascript 生成 typescript 声明文件
【发布时间】:2013-08-20 13:08:08
【问题描述】:

例如,你有一个 npm 库,在我的例子中是 mongoose,你将如何生成 d.ts 文件?

【问题讨论】:

标签: typescript


【解决方案1】:

这个问题有点老了,但是为了像我这样来自搜索引擎的人,如果您正在寻找自动化工具,请查看:

  • Microsoft/dts-gen

    微软在创建类型时使用的官方起点。虽然这只是一个起点,但仅仅依靠它我并没有得到很多运气

  • dtsmake

    这个看起来很有前途。这取决于一些编辑器用来为 JS 代码提供自动完成功能的 Ternjs。查看 Ternjs 以了解其他工具名称并与它们进行比较。

Update (2021): It's a good idea to check npmtrends and compare dts-generator, dts-gen, dtsmake, npm-dts, and alternatives.

【讨论】:

  • 是否无法以完全自动化的方式读取 JS 文件并为 TS 制作类型文件?我没有从 js 生成类型文件的经验
【解决方案2】:

您可能想看看“npm-dts”NPM 包。它是一个为你的 NPM 包生成单个 index.d.ts 文件的工具,以便其他 TypeScript 包可以直接使用它。

【讨论】:

    【解决方案3】:

    如果您尝试在 TypeScript 文件中使用第三方 JavaScript 库,则可以在项目的任何位置创建自定义(几乎是空白)声明文件。

    例如,如果您想导入:

    import * as fooLibrary from 'foo-lib';
    

    您将创建一个名为“foo-lib.d.ts”的新文件,其内容如下:

    declare module 'foo-lib' {
      var fooLibrary: any;
      export = fooLibrary;
    }
    

    【讨论】:

      【解决方案4】:

      对于通过 google 找到此帖子的其他人:Microsoft 现在有一个生成器:dts-gen

      【讨论】:

      【解决方案5】:

      JavaScript 并不总是包含足够的类型信息,以便 TypeScript 编译器推断代码中的结构 - 因此基于 JavaScript 自动生成定义很少是一种选择。

      这里有关于如何从头开始编写它们的说明:

      https://www.stevefenton.co.uk/2013/01/complex-typescript-definitions-made-easy/

      但是有一个技巧可能会奏效(它只在有限的情况下有效)。

      如果您将 JavaScript 粘贴到新的 TypeScript 文件中,修复您可能遇到的任何琐碎错误并使用定义标志对其进行编译,它也许能够为您提供一个至少可以作为起点的文件。

      tsc --declaration js.ts
      

      【讨论】:

      • Steve Fenton 的链接很棒。只需一行,您就可以让复杂的库正常工作,而无需定义所有方法。在他的帖子中查看选项 #2。
      • 我不认为这是一个可以接受的有效答案,询问关于生成的问题,你不能总是手动扭曲所有的 js 库,它们是巨大的。如果手翘曲是唯一的选择,那么这个问题就不再被问到了。所以,看看“生成 dts”:github.com/SitePen/dts-generator
      • @nyconing - 答案末尾的代码行将生成类型定义(即不是手动)。此外,自 2013 年以来,出色的 TypeScript 团队增加了针对 JavaScript 文件运行编译器的功能,因此您甚至不必将其粘贴到 TypeScript 文件中即可受益于这一技巧。
      • @Fenton --declaration--allowjs 是独占的,所以您不能从 .js 文件中转储定义,对吗?
      • @KonstantinPelepelin 在我的回答中,我将 JavaScript 干扰到 .ts 文件中以生成起点 .d.ts 文件。所以我没有为此使用allowJS
      【解决方案6】:

      对于我使用来自第三方的混淆代码的特殊情况,我发现将脚本加载到页面中,然后使用控制台记录混淆类的实例很有用。控制台为您提供类方法和属性的简洁摘要,您可以将其复制并用作定义文件的起点。

      > o = new ObfuscatedClass()
      > console.log(o)
      ObfuscatedClass
      - methodA(a,b){some implementation}
      - methodB(a,b){other implementation} etc
      

      您可以复制粘贴和编辑到其中

      declare class ObfuscatedClass {
      
          methodA(a,b);
          methodB(a,b);
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        • 2019-04-03
        • 2013-04-12
        • 2021-03-25
        • 2018-10-27
        • 2016-09-27
        相关资源
        最近更新 更多