TypeScript中如何让函数arr参数类型随attr动态解析?
问题描述
现有如下TypeScript代码:
const func = <T>(obj: T, attr: keyof T, arr: T[typeof attr][]) => {} const obj = {foo: 1, bar: true}; func(obj, 'foo', [1]); func(obj, 'bar', [1]); // 这里应该报错 func(obj, 'foo', [true]); // 这里应该报错 func(obj, 'bar', [true]);
当前代码中,arr参数的类型始终被解析为(number | boolean)[],无法根据传入的attr参数动态匹配obj对应属性的类型。需要调整arr的类型定义,让TypeScript在调用func时能根据实际传入的attr自动推断arr的正确类型,实现类型匹配校验。
解决方案
核心是给函数增加一个额外的泛型参数K,将其约束为keyof T,用来明确指定当前传入的attr对应的键类型,这样就能精准关联obj中该键对应属性的类型,进而约束arr的类型。
修改后的代码如下:
const func = <T, K extends keyof T>(obj: T, attr: K, arr: T[K][]) => {} const obj = {foo: 1, bar: true}; func(obj, 'foo', [1]); // 类型正确,无报错 func(obj, 'bar', [1]); // 类型不匹配,TS报错:类型“number”的参数不能赋给类型“boolean”的参数 func(obj, 'foo', [true]); // 类型不匹配,TS报错:类型“boolean”的参数不能赋给类型“number”的参数 func(obj, 'bar', [true]); // 类型正确,无报错
通过引入泛型K,TypeScript可以准确追踪attr对应的键,从而将arr的类型严格限定为obj[attr]的数组类型,实现了动态的类型依赖匹配。
内容的提问来源于stack exchange,提问作者Pavel Staselun
相关产品推荐
相关产品推荐

