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

TypeScript如何从带id的联合类型中推导函数的对应返回子类型

解决方法

你需要通过泛型捕获传入sensorId的具体字面量类型,再关联到对应的返回值类型即可实现精准推导,以下是两种可行的实现方案:

方案1:基于Metric联合类型实现

// 泛型T捕获传入的sensorId具体字面量类型,用Extract从联合类型中筛选匹配的Metric类型
function getSensorMetrics<T extends Metric['sensorId']>(id: T): Extract<Metric, { sensorId: T }>[] {
  return metrics[id] as Extract<Metric, { sensorId: T }>[]
}

方案2:复用已有metrics类型(更简洁)

直接利用你已经定义好的metrics对象的类型,不需要额外类型运算,也无需类型断言:

function getSensorMetrics<T extends keyof typeof metrics>(id: T): typeof metrics[T] {
  return metrics[id]
}

效果验证

调用getSensorMetrics('ABC')[0].value时,TypeScript会自动推导返回值类型为[number, number],调用getSensorMetrics('DEF')[0].value时返回类型为{ foo: string, bar: number },完全符合预期。

原写法问题说明

你之前的写法中typeof id拿到的是入参的声明类型Metric['sensorId'](也就是'ABC' | 'DEF'联合类型),没有捕获到调用时传入的具体字面量类型,所以返回值只能推导为所有可能的Metric类型的联合,无法做到精准匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:15:04