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

TypeScript泛型类型推断疑问:两个取值函数的类型差异

为什么这两个TypeScript函数的返回类型不同?

先看你提供的代码:

const getValue = <TObj>(obj: TObj, key: keyof TObj) => {
  return obj[key];
};

const getValueMultiple = <TObj, TKey extends keyof TObj>(obj: TObj, key: TKey) => {
  return obj[key];
};

const result1 = getValue({ a: 1, b: 'some-text', c: true }, 'c');
// result1: string | number | boolean

const result2 = getValueMultiple({ a: 1, b: 'some-text', c: true }, 'c');
// result2: boolean

核心差异解析

  • getValue函数:仅声明了泛型TObj,key的类型是keyof TObj(即对象所有键的联合类型)。TypeScript推断时,会把obj识别为{a: number, b: string, c: boolean},keyof TObj就是"a" | "b" | "c"。此时函数返回类型被推断为TObj[keyof TObj]——也就是对象所有值类型的联合string | number | boolean,因为TypeScript无法确定你传入的key具体指向哪一个键,只能返回所有可能值的类型集合。

  • getValueMultiple函数:多声明了一个泛型TKey,并约束为TKey extends keyof TObj。此时TypeScript会同时推断TObj和TKey的具体类型:当你传入'c'作为key时,TKey会被精确锁定为"c",而非联合类型。函数返回类型也就变成了TObj[TKey],即对应"c"键的boolean类型,完全符合预期。

直白点说,第一个函数只捕获了对象的整体类型,没锁定具体键的类型;第二个函数通过额外的泛型参数,把具体键的类型也单独捕获了,所以能精准返回对应值的类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:39:52