Skip to main content

第三方库的类型声明

在 TS 日益火爆的今天,越来越多的开源社区贡献者将对 TS 的支持纳入到了开源库的开发中。也正因为如此,我们在进行开发时,如果引用到了第三方的库,也更加广泛地获得了对 TS 的支持。

需要注意的是,选择适合自己项目的解决策略时,最好遵循以下几个原则:优先选择现有的类型声明文件,然后使用@types包,接着考虑创建自定义类型声明文件,最后再考虑使用声明全局变量或类型断言。此外,还可以考虑为缺少类型声明的第三方库贡献类型声明文件,使其受益于整个开发社区。

对系统库的支持

通过在 tsconfig 中设置 lib 字段,即可添加对系统库的类型支持。 比如 lib: ES5 等等

不过值得一提的是,系统库并没有对 node 环境提供的系统模块进行支持,我们需要额外安装@types/node 来对 node 系统库进行支持。

如何在自己的项目中使用第三方库的声明

在 package 内添加的声明

许多直接使用 TS 开发的库,在经过编译构建之后,会在库构建目录下生成一个.d.ts 文件,这就是对应的.js 文件的声明文件。 为了让这个声明文件作为默认的类型入口给开发者提供支持,库开发者会在 package.json 中配置 typings: "./path/to/definition"的配置。 这种情况下,我们在引入第三方库的时候,就直接获得了类型支持。

使用@types(npm 官方的 scope)

考虑到 JS 开发者和 TS 开发者对类型声明的依赖度不同,一些第三方库并没有将.d.ts 声明文件纳入到自己的包中。比如 react。 他们将类型声明文件做成独立包,发布在 TS 类型声明仓库。当然,有一些第三方包的开发者,和声明包的开发者其实并不是同一批人,而是 TS 社区开源贡献者额外发布了声明文件来提供了对对应库的支持。 这个仓库中的项目会被 TS 官方定期发布到 NPM 的@types/scope 下,我们只需要在项目中安装@types/package_name 即可获得对应 package_name 的库的类型支持(前提是存在)。

第三方库未支持 TS

如果第三方库并没有提供对 TS 的支持,也没有其他开源贡献者在官方 Type Definition 仓库添加对应的声明包,那么我们就必须在项目内进行一些处理来暂时性地(当然,多数情况下其实是永久性的)添加对这个库的类型支持。 我们在项目目录下创建一个模块声明文件 definition.d.ts,这个文件的名字可以自由地进行命名,你可以将它命名为你要支持的库的名字,这都不会影响它的效果,你只需要将这个声明文件纳入到 tsconfig 的 include 范畴中去就可以了。 下面是一个声明文件的例子:

declare module 'package_name' {export default function main(): void;
}

在进行了这样的声明之后,我们就可以使用这个 package 了。

import main from "package_name";

main();

声明全局变量

如果只是需要在项目中使用某个全局变量,而不需要详细的类型检查,可以使用declare关键字声明该全局变量的类型。这样 TypeScript 将不会对该变量进行类型检查,但允许在代码中使用它。

使用类型断言

在某些情况下,可以使用类型断言(Type Assertion)来告诉编译器某个变量的类型。类型断言使用as关键字或<>语法。这可以临时绕过缺少类型声明文件的问题,但需要谨慎使用,确保类型断言的准确性。

希望更深入的学习,请移步 https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html