You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在避免冗余的情况下为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:27:16