如何为TypeScript函数定义与输入数组键完全匹配的返回类型
解决方法
首先定义你的Pets枚举:
enum Pets { KITTY = 'KITTY', PUPPY = 'PUPPY', BABY_SEAL = 'BABY_SEAL' }
接下来,给函数定义一个泛型参数,用来捕获传入的枚举成员数组的具体类型,再基于这个泛型推导精确的返回类型:
function getPetEyeColors<T extends Pets>(pets: T[]): Record<T, string> { const result = {} as Record<T, string>; pets.forEach(pet => { // 替换为实际获取眼睛颜色的逻辑 result[pet] = `${pet}的眼睛颜色`; }); return result; }
效果验证
调用函数时传入具体枚举成员数组,TypeScript会自动推断出精确的返回类型:
const eyeColors = getPetEyeColors([Pets.KITTY, Pets.PUPPY]); // eyeColors 类型被推断为 { KITTY: string; PUPPY: string } eyeColors.KITTY; // 正常访问 eyeColors.PUPPY; // 正常访问 eyeColors.BABY_SEAL; // 触发TS2339错误:属性'BABY_SEAL'不存在于类型'{ KITTY: string; PUPPY: string }'
核心原理
- 泛型
T extends Pets既限定了输入数组的成员只能是Pets枚举值,又精准捕获了传入的具体成员集合 - 返回类型
Record<T, string>基于捕获到的T(即传入枚举成员的联合类型)生成严格的键值对类型,替代了原本宽泛的Partial<Record<Pets, string>> - 函数内部的
as Record<T, string>类型断言是为了让空对象的赋值操作通过TypeScript类型检查,因为初始空对象无法直接匹配目标类型
内容的提问来源于stack exchange,提问作者CoderApprentice
相关产品推荐
相关产品推荐

