如何修改TypeScript嵌套条件映射类型让类型提示完全展开
解决方案
你可以通过调整递归逻辑的位置,强制TypeScript展开每一层的类型结构,修改后的BooleanResult定义如下:
type BooleanResult<T> = T extends object ? { [K in keyof T]: BooleanResult<T[K]> } : boolean[]
验证效果
代入你给出的业务类型计算后,得到的Result类型会完全展开,符合预期:
// 计算后Result类型为: type Result = { companyName: boolean[]; contactPerson: { firstName: boolean[]; lastName: boolean[]; email: boolean[]; }; }
原理说明
你原来的写法中,属性值的条件类型返回的是未计算的BooleanResult<T[K]>泛型表达式,TypeScript默认会惰性计算这类嵌套泛型,展示时会保留泛型名称而不展开内部结构。
修改后的写法将判断逻辑提升到泛型顶层,每一层递归都会直接返回一个映射对象类型,TypeScript会主动计算并展开所有层级的属性结构,不会保留BooleanResult的包装标识。
可选的轻量修改方案
如果你不想改动原有递归逻辑的结构,也可以通过交叉空对象的小技巧强制TypeScript展开类型:
type BooleanResult<T> = { [K in keyof T]: T[K] extends object ? (BooleanResult<T[K]> & {}) : boolean[] } & {}
内容的提问来源于stack exchange,提问作者Alexander Zeitler
相关产品推荐
相关产品推荐

