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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:52:03