TypeScript中如何动态为联合类型成员追加后缀生成扩展类型
TypeScript 基于已有字面量联合类型自动生成带后缀扩展类型
实现方案
你不需要维护两份独立的数组或类型定义,借助TypeScript原生的模板字面量类型,就可以自动为原有字符串联合类型的所有成员追加_max后缀,合并得到目标扩展类型。
首先保留你已有的基础定义:
const values = ['money', 'land'] as const; type ValueTypes = typeof values[number]; // 推导结果:type ValueTypes = 'money' | 'land'
通过模板字面量类型遍历原有联合类型,自动生成所有带_max后缀的字面量成员(TypeScript会对联合类型做分布式处理,自动给每个成员套用模板规则):
type MaxSuffixedTypes = `${ValueTypes}_max`; // 推导结果:type MaxSuffixedTypes = 'money_max' | 'land_max'
将基础类型和后缀类型做联合,就得到最终需要的扩展类型:
type ExtendedValueTypes = ValueTypes | MaxSuffixedTypes; // 推导结果:type ExtendedValueTypes = 'money' | 'land' | 'money_max' | 'land_max'
使用效果
将函数参数类型替换为扩展类型后,两种传参都能通过类型校验:
const check = (type: ExtendedValueTypes) => 'some return' // 原有调用正常通过 check('money'); check('land'); // 带_max后缀的调用也能正常通过校验 check('money_max') check('land_max') // 传入不存在的非法值会触发类型报错,符合类型约束预期 // check('invalid_value') // 类型错误
后续你只需要修改values数组的成员,扩展类型会自动同步更新,完全不需要手动维护额外的类型列表。
内容的提问来源于stack exchange,提问作者Sinan Theuvsen
相关产品推荐
相关产品推荐

