NPM包开发时如何正确导出第三方无类型库的自定义类型?
问题修复方案
方案1:调整TS编译配置,让类型自动打包到dist目录
这是最通用的做法,适合用tsc直接编译或者配合打包工具的场景:
- 修改你的
tsconfig.json,把自定义类型目录纳入编译范围,同时开启类型声明输出:
{ "compilerOptions": { "declaration": true, // 开启生成.d.ts文件 "declarationDir": "./dist", // 类型声明输出到dist目录 "outDir": "./dist" }, "include": [ "src/**/*", "types/**/*" // 把自定义类型目录加进来 ] }
编译完成后,第三方库的类型定义会自动合并到dist的类型体系里,不需要额外手动复制文件。
- 如果你用的是
tsup、rollup这类打包工具,只需要在对应的dts配置里加上types目录的包含规则即可,比如tsup配置:
// tsup.config.js export default { entry: ['src/index.ts'], dts: { include: ['src/**/*', 'types/**/*'] }, outDir: 'dist' }
方案2:单独发布类型目录,在包配置中关联
如果你不想改动编译配置,也可以直接把自定义类型目录随包一起发布:
- 修改
package.json,把types目录加入发布白名单,同时关联类型声明:
{ "files": ["dist", "types"], // 发布时包含types目录 "types": "./dist/index.d.ts", "typesVersions": { "*": { "third-party-library": ["./types/third-party-library/index.d.ts"] } } }
- 在你包的入口类型文件(dist/index.d.ts)最顶部加一行引用指令:
/// <reference types="../types/third-party-library" />
实践合理性说明
你当前的做法不属于不良实践,是缺失类型的第三方库的常规兼容方案,但有两种更规范的优化方向:
- 如果该第三方库的类型通用性较强,可以将你写的类型贡献到DefinitelyTyped社区,发布为
@types/third-party-library的公共包,你自己的包直接把这个@types包加为开发依赖即可,所有用到这个库的开发者都能共用类型。 - 如果该类型只在你的包内部使用,不需要对外暴露,可以把
INeedThis这类用到的接口直接复制到你自己的包的类型定义里,避免对外注入全局模块声明,防止和其他用户自己写的同库声明产生冲突。
内容的提问来源于stack exchange,提问作者idlackage
相关产品推荐
相关产品推荐

