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

TypeScript如何定义合法的通用扁平对象键值对类型?

报错原因

TypeScript 的普通索引签名不支持直接使用联合类型作为键的类型,仅允许单独的 string/number/symbol/模板字符串类型,因此你直接写 [k: string | number] 会触发类型报错。

最佳实现方案

根据你两种不同的预期值类型,分别对应以下实现:

方案1:值为任意类型(对应你第一种写法的需求)

优先用 TS 内置的 Record 映射类型实现,写法简洁无报错:

type KEY_VALUES = Record<string | number, any>

如果不想用内置类型,也可以手动写映射类型语法,效果完全等价:

type KEY_VALUES = { [k in string | number]: any }

补充:由于 JS 运行时会自动将对象的数字键转为字符串存储,你直接写 Record<string, any> 也可以正常兼容数字类型的键,不需要显式写联合类型。

方案2:值为带命名的单元素元组(对应你第二种预期写法的需求)

只需要修改 Record 的第二个值类型参数即可:

type KEY_VALUES = Record<string | number, [value: any]>

手动映射类型的等价写法:

type KEY_VALUES = { [k in string | number]: [value: any] }

可选优化建议

如果不需要完全放开值的类型,建议把 any 替换为实际的值类型,或者用 unknown 替代 any 来获得更严格的类型校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:06:04