TypeScript如何复用类型与对应常量?减少冗余定义
解决方案:从值生成类型,消除冗余
你的代码冗余问题可以通过先定义运行时数据,再基于数据生成类型的方式解决——TypeScript支持从字面量值精确推断类型,同时用as const保证calories被推断为固定的数字字面量(而非宽泛的number类型)。
完整优化代码
// 唯一的数据源:定义所有口味的运行时数据,as const 强制TS推断精确的字面量类型 const iceCreamData = { chocolate: { flavour: 'Chocolate', calories: 120 }, vanilla: { flavour: 'Vanilla', calories: 90 }, mango: { flavour: 'Mango', calories: 110 }, mint: { flavour: 'Mint', calories: 100 }, } as const; // 从数据源生成单个口味的类型 type IceCreamFlavour = typeof iceCreamData[keyof typeof iceCreamData]; // 等价于原来的 UseCase 联合类型 type UseCase = IceCreamFlavour; // 如果需要单独的口味类型(比如原来的 Chocolate/Vanilla),直接从数据源提取 type Chocolate = typeof iceCreamData.chocolate; type Vanilla = typeof iceCreamData.vanilla; type Mango = typeof iceCreamData.mango; type Mint = typeof iceCreamData.mint; // 导出常量,直接复用数据源的属性,无需重复定义 export const chocolate = iceCreamData.chocolate; export const vanilla = iceCreamData.vanilla; export const mango = iceCreamData.mango; export const mint = iceCreamData.mint;
关键细节说明
as const的作用:将对象标记为只读的字面量类型,确保calories被推断为具体的数字(如120)而非number类型,完全符合你要求的硬编码固定值限制。- 类型推导逻辑:
typeof iceCreamData获取数据源的类型;keyof typeof iceCreamData获取数据源的所有键('chocolate' | 'vanilla' | 'mango' | 'mint');typeof iceCreamData[keyof typeof iceCreamData]提取所有口味对象的类型,自动生成联合类型。
- 无冗余复用:运行时数据只需要写一次,类型和导出的常量都基于它生成,避免了重复编写相同的结构和值。
为什么不反向从类型生成值?
TypeScript的类型系统是编译时概念,编译后会被完全擦除,无法直接从类型生成运行时值。所以从值生成类型是更务实的方案,既能保证类型精确,又能消除冗余。
内容的提问来源于stack exchange,提问作者Gambit2007
相关产品推荐
相关产品推荐

