TypeScript:如何从混合类型对象数组推导Id联合类型并修复类型错误?
修复方案
问题出在你原有的泛型定义上:<Id> 强制要求数组中所有元素的 id 必须是同一类型,当输入数组包含不同类型的 id 时,TypeScript 无法找到一个统一的 Id 类型匹配所有元素,因此报错。
你需要调整泛型约束方式,让函数接受包含任意 id 类型的对象数组,并正确提取精确的 id 类型(单个元素或联合类型)。
方法1:返回第一个元素的精确id类型
const input = [ { id: "a" }, { id: 5 } ] const getFirstId = <T extends readonly { id: unknown }[]>(data: T): T[0]['id'] => { return data[0].id } const firstId = getFirstId(input) // firstId 类型为 "a"
方法2:返回所有元素id的联合类型
如果你希望返回类型是数组中所有id的联合类型(即 "a" | 5),可以这样写:
const input = [ { id: "a" }, { id: 5 } ] const getFirstId = <T extends { id: unknown }>(data: readonly T[]): T['id'] => { return data[0].id } const firstId = getFirstId(input) // firstId 类型为 "a" | 5
原理说明
- 原写法中,
ReadonlyArray<Data<Id>>要求数组内每个元素的id都必须是Id类型,这限制了数组只能包含同类型id的对象。 - 修改后的泛型直接约束整个数组类型,TypeScript 会自动推断出数组中每个元素的具体类型,进而提取出对应
id的精确类型(或联合类型),不再强制所有id类型一致。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

