从javascript生成typescript声明文件

Gam*_*iac 60 typescript

比方说,你有一个npm库,在我的情况下mongoose,你将如何生成d.ts文件?

Fen*_*ton 59

JavaScript并不总是包含足够的TypeScript编译器类型信息来推断代码中的结构 - 因此很少自动生成基于JavaScript的定义.

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

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

但是有一个可行的技巧(它仅适用于有限的一组案例).

如果您将JavaScript粘贴到新的TypeScript文件中,修复您可能获得的任何琐碎错误并使用定义标志进行编译,它可能会为您提供至少是起点的文件.

tsc --declaration js.ts
Run Code Online (Sandbox Code Playgroud)

  • 史蒂夫芬顿的链接很棒.使用一行,您可以在不需要定义所有方法的情况下使复杂的库工作.在他的帖子中查看选项#2. (3认同)
  • @KonstantinPelepelin 在我的回答中,我将 JavaScript 塞进了一个 `.ts` 文件中,以生成一个起始点 `.d.ts` 文件。所以我没有为此使用 `allowJS`。 (3认同)

Mel*_*igy 31

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

  • 微软/ DTS-根

    Microsoft在创建类型时使用的官方起点.这只是一个起点而且我没有得到很多运气,这取决于它

  • dtsmake

    这个看起来很有希望.它取决于一些编辑器用来为JS代码提供自动完成的Ternjs.

    还要查看其他工具名称并与它们进行比较.


小智 17

对于通过谷歌发现这篇文章的其他人:微软自己现在有一台发电机:dts-gen.

  • 请注意[dts-gen不支持ES6导入/导出](https://github.com/Microsoft/dts-gen/issues/42).: - / (7认同)

Ste*_*ush 6

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

例如,如果要导入:

import * as fooLibrary from 'foo-lib';
Run Code Online (Sandbox Code Playgroud)

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

declare module 'foo-lib' {
  var fooLibrary: any;
  export = fooLibrary;
}
Run Code Online (Sandbox Code Playgroud)


tar*_*ing 5

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

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

您可以复制粘贴并编辑到

declare class ObfuscatedClass {

    methodA(a,b);
    methodB(a,b);

}
Run Code Online (Sandbox Code Playgroud)