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

