如何像导出模块一样重新导出TypeScript类型?
问题场景
原本通过多层重导出的文件结构可以正常访问类型:
model/index.ts
export * as api from './api'
model/api.ts
export * from "./api.routes" // 需移除的导出
model/api.routes.ts
export type MyType = "hello"
组件中使用方式:
components/X.tsx
import { api } from '../model' type T01 = api.MyType
但移除model/api.ts里的export * from "./api.routes",并把合并逻辑移到model/index.ts后,代码改成这样:
model/index.ts
import * as api_ from './api' import * as routes from "./api.routes" export const api = { ...api_, ...routes, }
此时出现报错:Cannot find namespace 'api',类型无法正常传递。
解决办法
核心问题是:你现在导出的是值对象api,但TypeScript需要的是类型命名空间才能用api.MyType这种语法访问类型。可以通过「值合并 + 类型合并」的方式解决:
方案一:合并值与类型
修改model/index.ts:
import * as apiCore from './api' import * as apiRoutes from './api.routes' // 合并导出值(供运行时使用) export const api = { ...apiCore, ...apiRoutes } // 合并导出类型(供类型检查时使用) export type api = typeof apiCore & typeof apiRoutes
这样组件里就能正常使用:
import { api } from '../model' // 类型访问 type T01 = api.MyType // 值访问(如果api里有导出的函数/变量) api.someApiFunc()
方案二:纯重导出语法
如果不需要创建对象,直接用重导出语法也能实现:
// 把api核心导出为api命名空间 export * as api from './api' // 把路由的类型合并到api命名空间 export type { MyType } from './api.routes'
这种方式下,api.MyType同样可以正常访问。
内容的提问来源于stack exchange,提问作者Qwerty
相关产品推荐
相关产品推荐

