如何从现有的JavaScript库生成.d.ts"typings"定义文件?

Hot*_*key 173 typescript tsc

我使用了很多我自己和第三方的图书馆.我看到"typings"目录包含一些用于Jquery和WinRT ......但它们是如何创建的?

Rya*_*ugh 218

根据所涉及的库,它的编写方式以及您正在寻找的准确度,有几种选择可供选择.让我们按需要的大致降序来审查选项.

也许它已经存在

始终首先检查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使用--declaration来查看TypeScript对库类型的"最佳猜测".这将为您提供一个不错的起点,如果JSDoc注释编写良好且编译器能够找到它们,则可能与手工编写的文件一样好.

开始使用dts-gen

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

npm install -g dts-gen
dts-gen -m <your-module>
Run Code Online (Sandbox Code Playgroud)

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

点击贪睡按钮

如果您只是想稍后再进行操作并暂时不使用类型,那么在TypeScript 2.0中,您现在可以编写

declare module "foo";
Run Code Online (Sandbox Code Playgroud)

这将让你import"foo"模块与类型any.如果你想要在以后处理全局,那就写吧

declare const foo: any;
Run Code Online (Sandbox Code Playgroud)

这将给你一个foo变量.

  • 可以在https://github.com/borisyankov/DefinitelyTyped找到热门库的高质量定义集合. (65认同)
  • 哎哟......在许多情况下,这将成为进入的重要障碍.拥有一个可以根据类型推断至少输出"最佳猜测"的工具会很不错.虽然这些可能不是最佳的,但它们至少可以随着时间的推移而调整. (24认同)
  • 带有`--declaration`选项的`--allowJs`无法组合(在TypeScript 1.8和2.0中测试).如果我尝试,我得到:`错误TS5053:选项'allowJs'不能用选项'declaration'指定 (10认同)
  • "最佳猜测"工具不会比TypeScript中已有的IntelliSense更好.类型定义的好处是为编译器提供的信息比它可以"猜测"的更多. (9认同)
  • +1 - 更好的消息:` - declarations`生成`.js`文件和`.d.ts`文件,这意味着你只需要运行一次编译. (7认同)
  • @BorisYankov这个文件只会作为一个起点,包含想法的东西,用户稍后会继续修改... (3认同)

Jay*_*Kan 43

您可以使用tsc --declaration fileName.ts像瑞安介绍,也可以指定declaration: truecompilerOptionstsconfig.json假设你已经有一个tsconfig.json项目下.

  • 如果您正在开发一个您想要共享的Angular 2模块,这是最佳答案. (3认同)
  • @Kokodoko,你能尝试在你的`tsconfig.json`文件中添加`declaration:true`吗? (2认同)

Gor*_*sev 15

处理此问题的最佳方法(如果在DefinitelyTyped上没有声明文件)是仅为您使用的内容而不是整个库编写声明.这大大减少了工作 - 此外,编译器还可以通过抱怨缺少方法来帮助解决问题.

  • 不幸的是,该文档是无望的。 (2认同)

CCo*_*der 14

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

  • 据我所知,tsc可以编译任何有效的JavaScript,但如果它无效TypeScript(编译提供警告),那么--declarations标志不会输出.d.ts文件,所以除非您的库是用TypeScript编写的仍然需要手动创建声明文件. (3认同)

mag*_*ker 10

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

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

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

或者例如在您的package.json

"scripts": {
    "build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
Run Code Online (Sandbox Code Playgroud)

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


zow*_*ers 7

http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript 00:33:52中所述,他们构建了一个工具,将WebIDL和WinRT元数据转换为TypeScript d.ts