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

如何保留ProjectA隐式类型导入并向ProjectB共享类型?

解决方法:同时保留ProjectA全局隐式类型+支持ProjectB手动导入

核心思路

要同时满足「ProjectA全局可用无需export」和「ProjectB可手动导入」,关键是让类型既属于全局作用域,又能作为模块导出,避免直接在全局声明文件加export导致全局失效的问题。下面提供两种落地方案:


方案一:拆分全局声明与导出文件(最稳妥,无冲突)

适合类型较多、结构复杂的项目,彻底分离全局和导出逻辑:

  1. 保留ProjectA的全局类型文件
    原types/file.d.ts保持不变,继续作为全局声明:

    // ProjectA/types/file.d.ts
    type MyType = 'user' | 'admin';
    

    这样ProjectA内部依然可以直接用MyType,无需任何导入。

  2. 新增导出专用文件
    在ProjectA的types文件夹下新建exports.ts(或exports.d.ts),专门用来导出需要给外部用的类型:

    // ProjectA/types/exports.ts
    // 直接引用全局声明的类型再导出
    export type MyType = MyType;
    // 其他需要导出的类型同理
    export type AnotherType = AnotherType;
    
  3. ProjectB配置与导入
    在ProjectB的tsconfig.json里配置路径别名,指向ProjectA的根目录:

    {
      "compilerOptions": {
        "baseUrl": ".",
        "paths": {
          "@ProjectA/*": ["../ProjectA/*"] // 根据实际相对路径调整
        }
      },
      "include": ["../ProjectA/types/**/*.d.ts", "./src/**/*"]
    }
    

    之后ProjectB就可以正常导入:

    import type { MyType } from "@ProjectA/types/exports";
    

方案二:单文件同时支持全局与导出(更简洁)

如果项目类型不多,可以直接修改原有.d.ts文件,用declare global包裹全局类型,同时单独导出:

  1. 修改ProjectA的类型文件

    // ProjectA/types/file.d.ts
    // 用declare global包裹,确保类型在ProjectA全局生效
    declare global {
      type MyType = 'user' | 'admin';
      type AnotherType = 'foo' | 'bar';
    }
    
    // 单独导出供外部导入使用
    export type MyType = MyType;
    export type AnotherType = AnotherType;
    

    这样ProjectA内部依然可以直接用全局类型,同时文件因为有export被识别为模块,允许外部导入。

  2. ProjectB配置与导入
    同样在ProjectB的tsconfig.json配置路径别名后,直接导入目标文件:

    import type { MyType } from "@ProjectA/types/file.d.ts";
    

关键注意事项

  • 不要直接在全局.d.ts文件顶部加export,否则整个文件会变成模块,全局声明会失效,必须用declare global包裹全局类型后再单独导出。
  • 如果ProjectA是作为npm包发布的,可以在package.json里配置"types": "./types",这样ProjectB安装后无需配置路径别名就能直接导入。

内容的提问来源于stack exchange,提问作者Jérôme Cheneaux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:00:02