如何在编译时提取TypeScript类型字段中的常量字符串字面量
首先明确核心限制:TypeScript 所有类型定义都是编译期特性,运行时会被完全擦除,MyType 作为类型本身不会出现在最终运行代码里,因此直接写 MyType.action 是不可能实现的。
你可以用以下两种方案在不单独拆分定义字面量常量的前提下满足需求:
方案1:从运行时常量推导类型(最推荐)
先定义带字面量值的常量对象,再从对象反向推导需要的MyType类型,实现一份定义同时给编译期类型、运行时值使用:
// 用as const固定所有属性的字面量类型 const MyTypeMeta = { action: 'TestAction', arg0: true } as const; // 从常量推导MyType类型,和你原本定义的类型完全等价 export type MyType = { action?: typeof MyTypeMeta.action; arg0: typeof MyTypeMeta.arg0; }; // 运行时直接引用常量属性即可 let input: any = { action: 'XYZ', }; if (input.action === MyTypeMeta.action) { // 执行对应逻辑,TS还能自动推导该分支内input.action的类型为'TestAction' }
该方案优势是类型和运行时值天然同步,修改时只需要调整MyTypeMeta一处即可,不会出现类型定义和实际运行值不一致的问题。
方案2:从已有类型约束常量值
如果你已经预先定义好了MyType类型,不想调整结构,可以直接基于类型提取字段类型,约束运行时常量的取值:
export type MyType = { action?: 'TestAction'; arg0: true, }; // 提取MyType的action字段类型,TS会自动校验赋值的字面量是否匹配类型 const MyTypeAction = 'TestAction' as NonNullable<MyType['action']>; let input: any = { action: 'XYZ', }; if (input.action === MyTypeAction) { // 执行对应逻辑 }
后续如果修改了MyType中action的字面量定义,TS会直接抛出类型错误,提示你MyTypeAction的取值不匹配,避免不同步问题。
内容的提问来源于stack exchange,提问作者user142162
相关产品推荐
相关产品推荐

