如何无需逐个声明,重新导出TypeScript命名空间内的所有类型?
解决方案
要实现无需添加Definitions前缀直接使用接口,目前TypeScript没有原生支持一次性导出命名空间内所有类型到顶级的语法,但可以根据需求选择以下方案:
方案1:导出整个命名空间(简化使用步骤)
在包的主文件index.ts中直接导出整个Definitions命名空间:
import type { Definitions } from './types'; export { Definitions };
使用时可以简化为:
import { Definitions } from 'my-package-with-the-defs'; const foo: Definitions.Foo = { ... };
这个方案无需逐个声明类型,也不需要额外生成文件,只是使用时仍需通过命名空间访问,但比原写法更简洁。
方案2:自动生成导出语句(满足直接导入单个类型)
如果必须直接导入Foo、Bar等类型,又不想手动逐个声明,可以写一个简单的Node.js脚本,读取types.d.ts文件自动提取Definitions内的接口名,生成对应的导出语句到index.ts中。
脚本示例:
const fs = require('fs'); const content = fs.readFileSync('./types.d.ts', 'utf8'); const matches = content.match(/export interface (\w+)/g); const exportLines = matches.map(match => { const name = match.replace('export interface ', ''); return `export type ${name} = Definitions.${name};`; }); const indexContent = `import type { Definitions } from './types';\n${exportLines.join('\n')}`; fs.writeFileSync('./index.ts', indexContent);
运行脚本后就能自动生成所有类型的导出语句,之后就可以直接使用import { Foo } from 'my-package-with-the-defs'了。不过这个方案需要额外的脚本生成步骤,不符合“无需额外生成导出文件”的要求,但这是目前实现直接导入单个类型的唯一可行方式。
说明
由于TypeScript暂不支持直接展开命名空间的所有类型作为顶级导出,如果你既不想逐个手动声明,又不能使用脚本生成,那只能接受方案1的简化写法。
内容的提问来源于stack exchange,提问作者bp99
相关产品推荐
相关产品推荐

