TypeScript 如何解包 Maybe<T> 类型并提取其包裹的内部类型
解法
方法1:使用你自己实现的条件类型
你写的条件类型思路完全正确,只需要按顺序先解包Maybe类型,再提取下层字段即可:
type Maybe<T> = T | null type MyData = { postTitle: string } & { meta: Maybe<{ tags: Array<El> }> } // 你写的解包类型,命名可根据语义调整 type UnwrapMaybe<T> = T extends Maybe<infer U> ? U : T // 提取流程 type Meta = UnwrapMaybe<MyData['meta']> // 解包后得到 { tags: Array<El> } type Tags = Meta['tags'] type TargetEl = Tags[number] // 最终得到的El类型
方法2:使用TS内置工具类简化
因为你的Maybe本质是T | null,可以直接用TS内置的NonNullable<T>工具类实现解包,一行即可完成提取:
type ExtractedEl = NonNullable<MyData['meta']>['tags'][number]
原理解释
你之前操作失败的原因是没有先处理Maybe带来的null可能性:未解包的MyData['meta']是联合类型{ tags: Array<El> } | null,null类型不存在tags属性,直接取下标会报错。你实现的UnwrapMaybe或者内置的NonNullable都会过滤掉联合类型中的null,拿到实际被包裹的业务类型,之后就可以用你熟悉的嵌套下标方式提取深层字段类型了。
内容的提问来源于stack exchange,提问作者HynekS
相关产品推荐
相关产品推荐

