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
相关产品推荐
相关产品推荐

