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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:33:33