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

如何约束泛型参数为无索引签名的Record<string, number>子类型?

解决TypeScript泛型约束中接口无索引签名的兼容问题

问题核心是Record<string, number>要求类型必须带有字符串索引签名,而你定义的Yes_2接口只声明了特定属性,没有索引签名,TypeScript会默认认为该接口可能存在其他未声明的字符串键属性,且这些属性的值类型不确定,因此不满足约束。

以下是两种无需添加索引签名的解决方案:

方案1:约束所有属性值为number(自动兼容接口与类型别名)

直接约束泛型参数的每个属性值都必须是number,无需关心是否有索引签名:

function F<X extends { [K in keyof X]: number }>() {}

测试验证:

type Yes_1 = { a: 1, b: 2 }
interface Yes_2 { a: number; b: number }
type No_1 = { a: number, b: string }

F<Yes_1>() // ✅ 正常通过
F<Yes_2>() // ✅ 正常通过
F<No_1>() // ❌ 报错(b属性为string,不符合number约束)

方案2:仅约束字符串键对应的属性值为number

如果需要排除非字符串类型的键(比如number类型的键),可以结合Extract过滤键类型:

function F<X extends Record<Extract<keyof X, string>, number>>() {}

这个约束会只检查X中所有字符串类型的键对应的属性值是否为number,非字符串键的属性不会被校验。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:06:04