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

TypeScript如何导入文件变量生成类型且避免运行时代码

从常量文件生成TypeScript联合类型且避免运行时变量

问题场景

现有包含大量常量的文件:

// foo.ts
export const FOO = 'foo';
export const BAR = 'bar';

需要声明一个类型FooConst,强制value只能是上述常量之一。当前写法虽能实现需求,但会生成进入运行时/打包文件的额外变量fooObjects:

// fooTypes.ts
import * as consts from './foo';

const fooObjects = Object.values(consts);  // 不希望生成该运行时变量
export type FooConst = fooObjects[number]; // 期望类型为 "foo" | "bar"

同时不想手动重复声明所有常量为联合类型,尝试在声明文件中实现时,出现错误:环境上下文中不允许使用语句.ts(1036)。

解决方案

通过纯类型推导实现需求,完全不产生运行时代码:

方法1:在普通TypeScript文件中推导

// fooTypes.ts
import * as consts from './foo';

// 直接通过类型系统生成联合类型,无任何运行时变量
export type FooConst = typeof consts[keyof typeof consts];

方法2:在声明文件(.d.ts)中实现

如果需要在声明文件中定义该类型,直接使用同样的类型推导逻辑即可,避免添加语句类代码:

// fooTypes.d.ts
import * as consts from './foo';

export type FooConst = typeof consts[keyof typeof consts];

原理说明

  • typeof consts:获取模块foo.ts导出的所有常量的类型集合
  • keyof typeof consts:提取该类型集合的所有键名,即 "FOO" | "BAR"
  • typeof consts[keyof typeof consts]:遍历每个键名对应的常量值类型,最终合并为所有常量值的联合类型 "foo" | "bar"

整个过程仅在TypeScript类型检查阶段完成,不会生成任何进入打包文件的运行时代码,同时无需手动重复声明联合类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:55:31