如何从现有的JavaScript库生成一个.d.ts "typings"定义文件?
如何从现有的JavaScript库生成.d.ts "typings"定义文件?
问题的出现原因:
- 我创建了自己的库,想要生成.d.ts文件以便使用接口,但是不知道如何生成这些文件。
解决方法:
1. 可以使用TypeScript编译器命令tsc来生成.d.ts文件,命令如下:
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
参数解释:
- `-d`(`--declaration`):生成.d.ts文件
- `--declarationDir dist/lib`:指定生成的声明文件的输出目录
- `--declarationMap`:为每个.d.ts文件生成sourcemap
- `--emitDeclarationOnly`:仅生成.d.ts声明文件,不生成编译后的JS文件
2. 在package.json中配置npm脚本,命令如下:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly"
}
然后运行命令`yarn build:types`(或`npm run build:types`)即可生成.d.ts文件。
3. 如果无法使用生成的.d.ts文件,可以参考以下链接的解决方案:stackoverflow.com/questions/59742688
通过上述方法,我们可以轻松地从现有的JavaScript库生成.d.ts "typings"定义文件,并且能够正确使用接口。
如何从现有的JavaScript库生成.d.ts“typings”定义文件?
问题的出现原因:
- 有时候我们需要在TypeScript项目中使用已有的JavaScript库,但是JavaScript没有类型系统,无法提供给TypeScript编译器正确的类型信息。
- 在这种情况下,我们需要手动创建一个.d.ts文件,来描述JavaScript库的类型信息,以便TypeScript编译器能够正确地进行类型检查。
解决方法:
1. 首先,我们可以检查DefinitelyTyped(https://github.com/DefinitelyTyped/DefinitelyTyped)这个社区仓库,其中包含了成千上万个.d.ts文件,很可能你要使用的库已经存在对应的.d.ts文件。
2. 另外,我们还可以检查TypeSearch(https://microsoft.github.io/TypeSearch/),这是一个用于搜索已发布在NPM上的.d.ts文件的搜索引擎,它可能比DefinitelyTyped有更多的定义文件。
3. 有些模块也会在其NPM分发中附带自己的定义文件,因此在尝试手动创建之前,也可以先查看是否已经存在相关的定义文件。
4. 如果TypeScript的--allowJs
选项可以提供足够好的类型信息,我们可以将JavaScript文件包含在编译中,并使用--allowJs
来启用对JavaScript文件的类型推断。TypeScript会识别ES5风格的类和JSDoc注释,但是如果库以一种奇怪的方式进行初始化,可能会出现问题。
5. 如果--allowJs
无法提供满意的结果,并且想要自己编写更好的定义文件,可以将--allowJs
和--declaration
结合使用,看看TypeScript对库类型的“最佳猜测”。这将为你提供一个不错的起点,并且如果JSDoc注释写得很好且编译器能够找到它们,可能会与手动编写的文件一样好。
6. 如果--allowJs
无法满足需求,可以尝试使用dts-gen(https://github.com/Microsoft/dts-gen)来生成一个起点。该工具使用对象的运行时形状来准确列举所有可用的属性。这种方法往往非常准确,但该工具目前不支持解析JSDoc注释以添加其他类型。可以通过以下命令运行该工具:
npm install -g dts-gen dts-gen -m
这将在当前文件夹中生成
7. 如果暂时不需要类型,可以使用TypeScript 2.0中的declare module
语法。例如,可以使用declare module "foo";
来以any
类型导入"foo"
模块。如果以后需要处理全局变量,可以使用declare const foo: any;
来声明foo
变量。
以上是从现有JavaScript库生成.d.ts“typings”定义文件的一些选项和解决方法。根据具体情况选择合适的方法,以便在TypeScript项目中正确使用JavaScript库。