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

TypeScript泛型对象键值类型收窄失效问题求助

问题解答:TypeScript回调中key与value的类型关联问题

问题原因

你当前的写法中,回调函数的value参数类型被推断为T[keyof T](即所有属性值的联合类型),因为typeof key在这里代表的是整个keyof T联合类型,而非单个具体的键类型。TypeScript无法自动将key的类型守卫结果与value的类型做关联绑定。

解决方案:使用泛型回调函数

TypeScript 5.6.2完全支持这种键值类型关联的场景,只需将回调函数本身定义为泛型函数,让key对应一个具体的子类型K extends keyof T,此时value的类型会自动绑定为T[K],类型守卫就能同时收窄key和value的类型。

修正后的代码:

function foo<T>(data: T, cb: <K extends keyof T>(key: K, value: T[K]) => void): void {}

foo(
  {
    a: true,
    b: 'abc',
  },
  (key, value) => {
    switch (key) {
      case 'a':
        key; // 类型:"a"
        value; // 类型:boolean ✅
        break;
      case 'b':
        key; // 类型:"b"
        value; // 类型:string ✅
        break;
    }

    if (key === 'b') {
      value; // 类型:string ✅
    }
  },
);

原理说明

将回调声明为<K extends keyof T>(key: K, value: T[K])后,每次调用回调时,TypeScript会为当前处理的键推断出具体的K类型(比如"a"或"b")。当你通过switch或if对key进行类型守卫时,TS会同步将K收窄到对应的具体键类型,从而让value的类型自动对应到T[K],实现键值类型的动态关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:22:12