如何修正extractIdFromObject函数的TypeScript类型推导,获取正确U类型?
解决TypeScript泛型函数无法正确推断id类型的问题
这个问题核心是原泛型定义的方式让TypeScript没办法准确推断出U的类型,咱们可以通过两种调整方式来修复:
方案一:直接从泛型T中提取id的类型
修改函数的返回类型为T['id'],这样TypeScript会直接从传入的对象类型里提取id属性的类型:
function extractIdFromObject<T extends { id: unknown }>(item: T): T['id'] { return item.id; }
方案二:直接将U作为id属性的类型
简化泛型定义,让U直接对应id的类型,TypeScript会自动从传入的item.id值推断出U的具体类型:
function extractIdFromObject<U>(item: { id: U }): U { return item.id; }
测试验证
用这两种方式重新定义函数后,再执行你的测试代码,TypeScript就能正确推断变量类型了:
const x = extractIdFromObject({ id: 1 }); // x: number const y = extractIdFromObject({ id: "1" }); // y: string const z = extractIdFromObject({ id: {} }); // z: {}
原代码问题原因
原代码function extractIdFromObject<T extends { id: U }, U>(item: T) { return item.id; }中,泛型U没有明确的推导来源——TypeScript无法从T的约束里确定U的具体类型,所以默认会将U推断为{},导致所有返回值的类型都变成了{}。而调整后的两种方案都明确了类型推导的依据,让TypeScript能准确获取id的真实类型。
内容的提问来源于stack exchange,提问作者ed'
相关产品推荐
相关产品推荐

