如何在避免冗余的情况下为API分发Typescript类型?
可行的TypeScript扩展API类型方案
方案1:将主程序包直接作为类型依赖
让你的主程序包自带完整的TypeScript类型定义,扩展开发者只需将主程序包作为开发依赖安装,直接从主程序包导入公开API类型即可。
- 配置主程序的
tsconfig.json,开启declaration: true和declarationMap: true,编译时自动生成.d.ts类型文件及映射文件。 - 在主程序的
package.json中指定types字段,指向编译后的入口类型文件(比如"./dist/index.d.ts")。 - 扩展开发者的代码中,直接导入主程序的公开类型:
import type { ExtensionContext, ExtensionExport } from 'your-main-app-package' const extension: ExtensionExport = { activate(context: ExtensionContext) { // 基于主程序真实类型开发,获得完整的类型提示 } } export default extension
这种方式下,主程序就是API类型的唯一事实来源,无需额外维护独立的API包,主程序开发时也不用冗余的类型继承操作,扩展拿到的就是主程序的真实类型。
方案2:在主程序中拆分公开API类型入口
如果不想让扩展开发者接触主程序的内部类型,可以在主程序中单独抽离公开API的类型到特定文件(比如src/public-api.ts),然后通过package.json配置让扩展可以精准导入这部分类型。
- 在主程序中创建
src/public-api.ts,仅导出需要暴露给扩展的类型和接口:// 仅导出扩展需要的公开类型 export interface ExtensionContext { appVersion: string registerCommand: (name: string, callback: () => void) => void } export type ExtensionExport = { activate: (context: ExtensionContext) => void } - 在主程序的
package.json中,通过typesVersions字段做类型映射,让扩展可以通过特定路径导入公开类型:{ "typesVersions": { "*": { "public-api": ["./dist/public-api.d.ts"] } } } - 扩展开发者只需导入公开API入口的类型:
import type { ExtensionContext, ExtensionExport } from 'your-main-app-package/public-api'
这种方式既保留了主程序作为类型来源的权威性,又隔离了内部类型,避免扩展拿到不必要的类型信息。
方案3:使用类型声明文件扩展主程序类型(适配动态场景)
如果你的扩展API存在动态扩展的需求(比如主程序运行时才会注入某些API),可以在主程序中定义基础类型,然后通过declare module让扩展可以补充类型,但这种方式更适合边缘场景,核心类型仍建议从主程序包直接导入。
比如主程序中定义基础的ExtensionContext,扩展可以通过声明模块来扩展它:
// 扩展的类型声明文件 declare module 'your-main-app-package' { interface ExtensionContext { customFeatureApi: { doSomething: () => void } } }
内容的提问来源于stack exchange,提问作者frqstbite
相关产品推荐
相关产品推荐

