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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:15:01