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
相关产品推荐
相关产品推荐

