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

如何以更简洁方式重新导出类及其类型至模块C?

问题描述

现有代码场景:

// a.ts
export default class A {...}
// b.ts
export default class B {...}

我希望将A、B作为模块C的成员重新导出,并以如下方式使用(需同时用到它们的类型和值):

import C from 'c.ts'
let instanceOfA : C.A = new C.A();
let instanceOfB : C.B = new C.B();

当前我编写的c.ts代码如下:

// c.ts
import _A from 'a.ts';
import _B from 'b.ts';
module C {
  export const A = _A;
  export type A = typeof _A;
  export const B = _B;
  export type B = typeof _B;
}
export default C;

请问是否有更简洁的实现方式?

注:我知晓直接从c.ts导出A、B,再通过import {A, B} from 'c.ts'或import * as C from 'c.ts'(使用C.A)的方式更简便,只是想了解是否有更优方案。


回答

当然有更简洁的实现方式,这里提供几种符合你需求的方案:

方案1:利用声明合并(Declaration Merging)

这种方式把值的导出和类型的定义分开,既保持了C.A同时作为值和类型的特性,又简化了代码结构:

// c.ts
import _A from './a.ts';
import _B from './b.ts';

// 导出包含A、B值的对象
export const C = {
  A: _A,
  B: _B
};

// 通过声明合并,给C对象附加类型成员
declare namespace C {
  export type A = typeof _A;
  export type B = typeof _B;
}

export default C;

使用方式和你原来的需求完全一致:

import C from './c.ts';
let instanceOfA: C.A = new C.A();
let instanceOfB: C.B = new C.B();

方案2:简化命名空间写法

TypeScript中module和namespace是同义词,你可以直接使用export namespace并将其作为默认导出,写法上更简洁直观:

// c.ts
import _A from './a.ts';
import _B from './b.ts';

export default namespace C {
  export const A = _A;
  export type A = typeof _A;
  export const B = _B;
  export type B = typeof _B;
}

这种方式和你原来的代码逻辑完全一致,只是把module换成了export namespace并直接默认导出,减少了冗余代码。

方案3:利用typeof自动推导类型(需调整类型访问方式)

如果你能接受类型访问时用C['A']而非C.A,可以用最简洁的写法:

// c.ts
import _A from './a.ts';
import _B from './b.ts';

// 导出常量对象,as const确保类型推导最精确
export default {
  A: _A,
  B: _B
} as const;

使用时的类型访问方式稍有变化:

import C from './c.ts';
// 用索引访问类型
let instanceOfA: typeof C['A'] = new C.A();
let instanceOfB: typeof C['B'] = new C.B();

这种方式完全不需要手动声明类型,依赖TypeScript的自动类型推导,代码最精简。

以上几种方案都能满足你的核心需求,你可以根据自己的代码风格和实际场景选择最合适的一种。


内容的提问来源于stack exchange,提问作者user3016883

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:41:02