如何保留ProjectA隐式类型导入并向ProjectB共享类型?
解决方法:同时保留ProjectA全局隐式类型+支持ProjectB手动导入
核心思路
要同时满足「ProjectA全局可用无需export」和「ProjectB可手动导入」,关键是让类型既属于全局作用域,又能作为模块导出,避免直接在全局声明文件加export导致全局失效的问题。下面提供两种落地方案:
方案一:拆分全局声明与导出文件(最稳妥,无冲突)
适合类型较多、结构复杂的项目,彻底分离全局和导出逻辑:
保留ProjectA的全局类型文件
原types/file.d.ts保持不变,继续作为全局声明:// ProjectA/types/file.d.ts type MyType = 'user' | 'admin';这样ProjectA内部依然可以直接用
MyType,无需任何导入。新增导出专用文件
在ProjectA的types文件夹下新建exports.ts(或exports.d.ts),专门用来导出需要给外部用的类型:// ProjectA/types/exports.ts // 直接引用全局声明的类型再导出 export type MyType = MyType; // 其他需要导出的类型同理 export type AnotherType = AnotherType;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包裹全局类型,同时单独导出:
修改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被识别为模块,允许外部导入。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
相关产品推荐
相关产品推荐

