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

