TypeScript能否推断Record类型的具体值而非联合类型?
让TypeScript推断变量为具体字面量类型的解决方案
你的需求完全可以实现,问题出在你给STATUS_TO_COLOR加了Record<Status, Color>的显式类型注解——这个注解会把对象的类型收窄到联合类型Color,直接覆盖了as const带来的字面量类型推断。下面是两种可行的解决方法:
方法一:用satisfies保证类型约束同时保留字面量推断
去掉Record<Status, Color>的类型注解,改用satisfies关键字,它既能确保对象符合Record<Status, Color>的结构要求,又不会阻止TypeScript推断每个属性的具体字面量类型:
type Status = 'Invalid' | 'Progress' | 'Complete' | 'Error'; type Color = 'yellow' | 'red' | 'green' | 'blue'; const STATUS_TO_COLOR = { Invalid: 'yellow', Progress: 'blue', Complete: 'green', Error: 'red', } as const satisfies Record<Status, Color>; const statusColor = STATUS_TO_COLOR["Invalid"]; // ^ 现在推断类型为 "yellow"
方法二:提取具体类型并手动断言
如果一定要保留Record<Status, Color>的显式注解,可以通过typeof提取对象的具体类型,再用类型断言指定变量的类型:
type Status = 'Invalid' | 'Progress' | 'Complete' | 'Error'; type Color = 'yellow' | 'red' | 'green' | 'blue'; const STATUS_TO_COLOR: Record<Status, Color> = { Invalid: 'yellow', Progress: 'blue', Complete: 'green', Error: 'red', } as const; // 提取对象的具体字面量类型 type StatusColorMap = typeof STATUS_TO_COLOR; const statusColor = STATUS_TO_COLOR["Invalid"] as StatusColorMap["Invalid"]; // ^ 推断类型为 "yellow"
第一种方法更优雅,既保证了类型安全,又不需要额外的类型断言,推荐使用。
内容的提问来源于stack exchange,提问作者Prabhat Pal
相关产品推荐
相关产品推荐

