如何以更简洁方式重新导出类及其类型至模块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
相关产品推荐
相关产品推荐

