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
相关产品推荐
相关产品推荐

