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
相关产品推荐
相关产品推荐

