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

如何基于联合类型参数推断返回类型?映射类型函数报错解决

解决TypeScript映射类型函数的类型推断错误

错误原因

你的函数使用泛型T extends keyof MappedType,但TypeScript无法在if (key === 'a')的分支中自动将泛型T缩小为具体的'a'——因为T可能是'a' | 'b'的联合类型。此时TypeScript会认为返回值必须满足所有MappedType[T]的交集(即{a: string} & {b: number}),而你的返回值只符合MappedType['a'],因此触发类型错误。

解决方案

方案1:使用函数重载(推荐)

通过重载签名明确不同参数对应的返回类型,让TypeScript精准推断:

type MappedType = {
  a: {
    a: string;
  };
  b: {
    b: number;
  }
};

// 重载签名:定义不同入参对应的返回类型
function getValue(key: 'a'): MappedType['a'];
function getValue(key: 'b'): MappedType['b'] | undefined;
// 实现签名:包含所有可能的情况
function getValue(key: keyof MappedType): MappedType[keyof MappedType] | undefined {
  if (key === 'a') {
    return { a: '2' };
  }
  return;
}

方案2:使用类型断言

如果不想用重载,可以在返回时用类型断言告诉TypeScript当前分支的返回值符合MappedType[T]:

type MappedType = {
  a: {
    a: string;
  };
  b: {
    b: number;
  }
};

function getValue<T extends keyof MappedType>(key: T): MappedType[T] | undefined {
  if (key === 'a') {
    // 断言当前返回值匹配MappedType[T]
    return { a: '2' } as MappedType[T];
  }
  return;
}

说明

函数重载的方式更优,它能让函数的类型定义更清晰,调用时IDE会给出更精准的类型提示;类型断言则更简洁,但需要你确保断言的类型正确性,避免潜在的类型不匹配问题。

内容的提问来源于stack exchange,提问作者熊俊文

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:57:37