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

如何像导出模块一样重新导出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:14:56