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

TypeScript如何将Object.entries reduce生成的数组转为字面量类型

问题成因
  • Object.entries的默认类型定义会将as const对象的键拓宽为string类型,无法保留原始的键字面量类型
  • reduce初始值被显式声明为string[]类型,直接固定了整个reduce操作的返回值类型为字符串数组,所有元素类型都会被拓宽为通用string
  • TypeScript不会自动为模板字符串的运行时拼接操作生成字面量联合类型,这类推导需要在类型层面显式映射实现
解决方法

你不需要修改运行时的生成逻辑,只需要从原始的program类型显式映射出目标字面量联合,再给数组做类型标注即可:

const program = {
  morgning: ['breakfast', 'mingle'],
  evning: ['mingle', 'eat', 'party']
} as const

type Program = typeof program
// 遍历所有键,拼接生成目标字面量联合
type Namespace = {
  [K in keyof Program]: `${K & string}.${Program[K][number]}`
}[keyof Program]

const namespaceEvent = Object.entries(program).reduce(
  (acc, [namespace, events]) => [...acc, ...events.map(event => `${namespace}.${event}`)],
  [] as Namespace[] // 把初始值类型替换为Namespace[]
)

// 现在赋值非法值会正确触发类型报错
const test: Namespace = 'foo.bar'

如果需要确保运行时值和类型完全对齐,可以进一步封装泛型工具函数做转换,避免手动断言的风险。

内容的提问来源于stack exchange,提问作者Norfeldt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:15:04