72

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

4

6 回答 6

78

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

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

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

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

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

tsc --declaration js.ts
于 2013-08-18T18:07:31.537 回答
38

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

  • 微软/dts-gen

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

  • dtsmake

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

更新 (2021):检查 npmtrends 并比较dts-generator, dts-gen, dtsmake,npm-dts和 alternatives是个好主意。

于 2016-05-23T05:40:01.300 回答
20

对于通过谷歌找到这篇文章的其他人:微软自己现在有一个生成器:dts-gen

于 2017-01-01T11:50:47.590 回答
8

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

例如,如果您想导入:

import * as fooLibrary from 'foo-lib';

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

declare module 'foo-lib' {
  var fooLibrary: any;
  export = fooLibrary;
}
于 2017-09-29T17:19:19.333 回答
5

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

> 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);

}
于 2014-08-13T22:52:24.820 回答
1

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

于 2019-02-25T08:11:52.160 回答