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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:24:05