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

TypeScript中如何基于interface强制约束setValue的key对应value类型

问题根因

原函数中两个参数的类型没有建立关联关系:key: keyof T表示参数是T所有键的联合类型,value: T[keyof T]表示参数是T所有属性值类型的联合类型,TS只会分别校验两个参数是否命中各自的联合类型范围,不会校验二者是否匹配同一个属性的键值对应关系。

修复方案

新增一个泛型参数绑定键的类型,将两个参数的类型做关联即可:

interface User{
    name:string;
    age:number;
    friends:string[]
    hasPet:boolean
}

// 新增泛型K,约束为T的键的子类型,实现key和value的类型绑定
function setValue<T, K extends keyof T>(key: K, value: T[K] ):void{
    console.log(key, value)
    // ...some additional logic
}

setValue<User>("age", true ) // 此时会正确抛出类型错误:不能将类型“boolean”分配给类型“number”
setValue<User>("age", 20 ) // 类型校验正常通过
setValue<User>("name", "小明") // 类型校验正常通过
setValue<User>("friends", ["小红", "小李"]) // 类型校验正常通过
setValue<User>("hasPet", false) // 类型校验正常通过

修改后,传入第一个参数的具体键值时,TS会自动推导泛型K的实际类型,进而将第二个参数的类型自动限定为该键对应属性的类型,完全满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:24:02