TypeScript无法识别解构属性,unwrapFirstProperty返回any如何解决
问题原因
- 泛型参数缺乏约束:原函数的泛型
T没有做任何类型限制,TypeScript无法判定T一定是可遍历的对象类型,也无法感知它的属性值类型结构。 - 内置方法返回类型限制:TypeScript对
Object.values的默认返回类型推导为unknown[](严格模式下)或any[],直接取索引[0]时无法关联到泛型T的属性值类型。 - 无明确返回类型标注:原函数没有显式定义返回值类型,TypeScript只能沿用
Object.values返回元素的类型,自然得到any/unknown类型。
调整方案
你对单属性对象的解构理解是正确的:仅包含单个属性的对象,它的所有属性值的联合类型就等于唯一属性的值类型,刚好是你预期得到的解构结果类型。
你只需要给泛型加上对象约束,同时显式声明返回值为T的属性值联合类型即可,修改后的代码如下:
type MyResponse <T extends string> = { [key in T]: { message: string; status: number; } } // 泛型约束为对象类型,返回值声明为T的所有属性值的类型 function unwrapFirstProperty<T extends object>(response: T): T[keyof T] { return Object.values(response)[0] as T[keyof T]; } const response = { SOME_RESPONSE: { status: 200, message: 'success' } }; // 此时property的类型会被正确推导为 { message: string; status: number } const property = unwrapFirstProperty<MyResponse<'SOME_RESPONSE'>>(response);
如果你需要更严格的限制,要求传入的对象属性值必须是{ message: string; status: number }结构,也可以把泛型约束写得更具体:
function unwrapFirstProperty<T extends Record<string, { message: string; status: number }>>(response: T): T[keyof T] { return Object.values(response)[0] as T[keyof T]; }
内容的提问来源于stack exchange,提问作者LazioTibijczyk
相关产品推荐
相关产品推荐

