在TypeScript中如何声明一组文件必须导出指定名称与类型的内容?
TypeScript 强制多文件统一导出规范的实现方案
完全可以实现,核心是通过主动的类型匹配校验,在编译期拦截不符合导出要求的文件,以下是两种通用方案:
方案1:静态导入校验(适合文件数量固定的场景)
首先定义你要求的导出结构类型:
// 定义强制导出的结构,此处以要求导出 elem: Element 为例 type RequiredExports = { elem: Element; // 如果有其他要求的导出项,直接在这里加字段即可 };
新建一个校验文件,导入所有需要符合规范的文件,做类型断言校验:
// exports-validate.ts import type * as modA from './path/to/mod-a.ts'; import type * as modB from './path/to/mod-b.ts'; import type * as modC from './path/to/mod-c.ts'; // 所有需要校验的模块都在这里做类型导入 // 校验工具类型:如果实际导出符合要求则返回true,否则抛出类型错误 type AssertValidExport<T extends RequiredExports> = T; // 逐个校验模块 type _CheckModA = AssertValidExport<typeof modA>; type _CheckModB = AssertValidExport<typeof modB>; type _CheckModC = AssertValidExport<typeof modC>;
只要任意一个模块没有导出elem、或者elem的类型不匹配,TypeScript 会直接在该校验文件中抛出类型错误,无需运行即可发现问题。如果允许模块额外导出其他内容,仅要求必须包含指定导出项,这个方案已经可以满足需求。
方案2:批量导入校验(适合按目录统一加载的场景)
如果你的模块是按目录批量动态导入的,可以直接在导入时做类型约束:
// Vite 环境下用 import.meta.glob const modules = import.meta.glob<RequiredExports>('./modules/*.ts', { eager: true }); // Webpack 环境下用 require.context const modules = require.context('./modules', false, /\.ts$/) .keys() .map(key => require(key) satisfies RequiredExports);
导入时如果存在不符合导出要求的文件,TypeScript 会直接在导入语句处报错。
说明
你之前用.d.ts文件无法实现需求是正常的,因为.d.ts的作用是为已有代码补充类型声明,不具备主动约束源文件导出结构的能力,必须通过主动的类型匹配校验才能实现强制要求。
内容的提问来源于stack exchange,提问作者Piero Mori
相关产品推荐
相关产品推荐

