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

TypeScript递归映射类型Unwrap无法解析嵌套对象的问题咨询

嵌套解析PromiseOrValue类型的解决方案

先看你的原始类型定义:

type PromiseOrValue<T> = T | Promise<T>

type Generated = {
  foo: PromiseOrValue<string>
  bar: PromiseOrValue<BigNumber>
  baz: {
     hello: PromiseOrValue<number>
     world: PromiseOrValue<string>
  }
}

你写的Unwrap类型无法解析嵌套的baz对象,问题出在条件判断的逻辑顺序和递归处理时机:任何类型T都满足T extends PromiseOrValue<T>(因为PromiseOrValue<T>本身包含T),所以baz对应的对象类型会直接被推断为U返回,不会触发递归处理内部属性。

修正后的Unwrap类型需要先解包PromiseOrValue,再对解包结果递归处理嵌套对象:

type Unwrap<T> = 
  // 先处理PromiseOrValue解包,解包后继续递归处理结果
  T extends PromiseOrValue<infer U> 
    ? Unwrap<U> 
    // 如果是对象(非原始类型),遍历所有属性递归解包
    : T extends object 
      ? { [K in keyof T]: Unwrap<T[K]> } 
      // 原始类型直接返回
      : T;

此时Unwrap<Generated>会得到完全解包后的类型:

{
  foo: string;
  bar: BigNumber;
  baz: {
    hello: number;
    world: string;
  };
}

这个类型会递归处理所有层级的PromiseOrValue,不管是顶层属性还是嵌套对象内部的属性。

内容的提问来源于stack exchange,提问作者codebroccoli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:07:08