如何从现有的JavaScript库中生成.d.ts“类型”定义文件?


192

我自己和第三方都在使用很多图书馆。我看到“类型”目录包含一些Jquery和WinRT ...,但是它们是如何创建的呢?

Answers:


232

根据所涉及的库,它的编写方式以及所需的精度水平,有几种可用的选项供您选择。让我们按可取性的大致降序查看选项。

也许已经存在

始终首先检查DefinitelyTyped(https://github.com/DefinitelyTyped/DefinitelyTyped)。这是一个社区仓库,里面装满了成千上万个.d.ts文件,很可能您正在使用的东西已经存在。您还应该检查TypeSearch(https://microsoft.github.io/TypeSearch/),它是NPM发布的.d.ts文件的搜索引擎;这将比DefinitelyTyped具有更多的定义。一些模块也在NPM发行版中提供了自己的定义,因此在尝试编写自己的模块之前,请先查看是否存在这种情况。

也许你不需要一个

TypeScript现在支持该--allowJs标志,并将在.js文件中进行更多基于JS的推断。您可以尝试在编译中包括.js文件以及--allowJs设置,以查看是否为您提供了足够好的类型信息。TypeScript可以识别这些文件中的ES5样式类和JSDoc注释之类的东西,但是如果库以一种奇怪的方式初始化自身,它可能会被绊倒。

开始使用 --allowJs

如果--allowJs给您不错的结果,并且您想自己编写一个更好的定义文件,则可以将其--allowJs--declarationTypeScript对库类型的“最佳猜测” 结合使用。这将为您提供一个不错的起点,并且如果JSDoc注释写得很好并且编译器能够找到它们,那么它可能与手写文件一样好。

dts-gen入门

如果--allowJs不起作用,则可能要使用dts-gen(https://github.com/Microsoft/dts-gen)作为起点。该工具使用对象的运行时形状来精确枚举所有可用属性。从好的方面来说,这往往非常准确,但是该工具尚不支持抓取JSDoc注释来填充其他类型。您可以这样运行:

npm install -g dts-gen
dts-gen -m <your-module>

这将your-module.d.ts在当前文件夹中生成。

点击贪睡按钮

如果您只是想稍后再做,并且暂时不用输入类型,现在可以在TypeScript 2.0中编写

declare module "foo";

这将使您使用类型import为的"foo"模块any。如果您有一家跨国公司要稍后处理,只需写

declare const foo: any;

这会给你一个foo变量。


25
哎呀……在许多情况下,这将是进入的重大障碍。最好有一个可以根据类型推断输出至少“最佳猜测”的工具。尽管这些可能不是最佳选择,但至少可以随着时间进行调整。
Hotrodmonkey 2012年

7
+1-更多好消息:--declarations生成.js文件和.d.ts文件,这意味着您只需要运行一个编译即可。
Fenton


10
“最佳猜测”工具不会比TypeScript中已经存在的IntelliSense更好。类型定义的好处是为编译器提供了比“猜测”更多的信息。
鲍里斯·扬科夫

12
--allowJs--declaration选项不能组合使用(在TypeScript 1.8和2.0中测试)。如果尝试,我会得到:error TS5053: Option 'allowJs' cannot be specified with option 'declaration'
Alexey

52

您可以tsc --declaration fileName.ts像Ryan所描述的那样使用,也可以在假设您的项目已经存在的情况下指定declaration: trueunder 。compilerOptionstsconfig.jsontsconfig.json


4
如果您要开发要共享的Angular 2模块,这是最佳答案。
达西

如果我尝试尝试创建声明文件的类型时tsc --declaration test.ts出现错误Cannot find name...,那么在声明它们之前我需要这些类型吗?
Kokodoko

2
@Kokodoko,您可以尝试添加declaration: truetsconfig.json文件中吗?
JayKan

谢谢,我只是想从* .ts生成* .d.ts。
vintproykt


15

正如Ryan所说,tsc编译器具有一个从文件--declaration生成.d.ts文件的开关.ts。另请注意,(排除错误)TypeScript应该能够编译Javascript,因此您可以将现有的JavaScript代码传递给tsc编译器。


1
似乎当前将* .js文件传递到tsc会生成错误“读取文件“ angular-resource.js”时出错:找不到文件”。因此,您必须将* .js文件显式重命名为* .ts才能使用tsc。看到这个问题的详细信息-我试过angularjs使用此:typescript.codeplex.com/workitem/26
詹姆斯斯特拉坎

3
据我所知,tsc可以编译任何有效的JavaScript,但是如果它不是有效的TypeScript(编译会发出警告),则--declarations标志不会输出.d.ts文件,因此除非您的库是用TypeScript编写的,否则仍然需要手动创建声明文件。
2012年


3

这是一些PowerShell,可创建一个TypeScript定义文件,该文件包含多个库 *.js使用现代JavaScript文件。

首先,将所有扩展名更改为.ts

Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }

其次,使用TypeScript编译器生成定义文件。会有很多编译器错误,但是我们可以忽略这些错误。

Get-ChildItem | foreach { tsc $_.Name  }

最后,将所有*.d.ts文件合并为一个index.d.ts,删除import语句,然后default从每个导出语句中删除。

Remove-Item index.d.ts; 

Get-ChildItem -Path *.d.ts -Exclude "Index.d.ts" | `
  foreach { Get-Content $_ } | `
  where { !$_.ToString().StartsWith("import") } | `
  foreach { $_.Replace("export default", "export") } | `
  foreach { Add-Content index.d.ts $_ }

这以index.d.ts包含许多定义的单个可用文件结束。


2
第二步,Get-ChildItem | foreach {tsc --declaration $ _。Name }起作用(添加了缺少的--declaration参数)
Guru_07年

3

创建自己的库时,您可以*.d.ts使用tsc(TypeScript Compiler)命令来创建文件, 如下所示:(假设您将库构建到该dist/lib文件夹中)

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d--declaration):生成*.d.ts文件
  • --declarationDir dist/lib:生成的声明文件的输出目录。
  • --declarationMap:为每个相应的.d文件生成一个源映射。
  • --emitDeclarationOnly:仅发出“ .d.ts”声明文件。(没有编译的JS)

(请参阅文档有关所有命令行编译器选项,)

或者例如在您的package.json

"scripts": {
    "build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}

然后运行:(yarn build:typesnpm run build:types


我仍然不知道如何生成d.ts文件并能够使用界面。你有什么例子吗?
Danosaure

上面的npm脚本将生成*.d.ts文件,并将它们放在dist/lib文件夹中。您确实需要tsconfig.json在项目的根目录中有一个文件,但是该文件仍然可以在项目中正常运行。
magikMaker

暴露后,我将无法使用它们。我有以下文章stackoverflow.com/questions/59742688,如果可以使之工作?
Danosaure

2

我会寻找支持Script#或SharpKit的第三方JS库的现有映射。这些C#到.js交叉编译器的用户将面临您现在面临的问题,并且可能已经发布了一个开源程序来扫描您的第三方库并转换为骨架C#类。如果是这样,请破解扫描程序以生成TypeScript代替C#。

失败的话,将第3方库的C#公共接口转换为TypeScript定义可能比通过阅读源JavaScript进行转换更简单。

我特别感兴趣的是Sencha的ExtJS RIA框架,而且我知道已经发布了一些项目来生成Script#或SharpKit的C#解释。


FYI:我只是做了煎茶/ ExtJS的我的第一个打字稿定义文件:github.com/andremussche/extjsTypescript/blob/master/jsondocs/...
安德烈

嘿Camel Case,我整理了一个博客,将ExtJs与打字稿一起使用: blorkfish.wordpress.com/2013/01/28/using-extjs-with-typescript
blorkfish
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.