如何从Type|Type[]联合类型中提取未导出的基础Type类型?
从导出的联合类型中提取内部数组的基础类型(无需直接引用未导出类型)
假设我们有如下类型定义,其中CurrentType未导出,仅导出了包含它和它的数组类型的联合类型ExportedType:
interface CurrentType { a: string; b: number; } type ExportedType = CurrentType | CurrentType[] // 需要得到:type DesiredType = CurrentType
以下是两种无需直接引用CurrentType的实现方案:
方案一:通用条件类型提取(推荐)
通过条件类型判断输入类型是否为数组,自动推断并提取数组元素类型,非数组类型直接保留:
type ExtractBaseType<T> = T extends Array<infer U> ? U : T; type DesiredType = ExtractBaseType<ExportedType>; // 类型为 CurrentType
原理
ExtractBaseType会遍历联合类型的每个成员:
- 当成员是
CurrentType[]时,通过infer U推断出数组的元素类型CurrentType; - 当成员是
CurrentType时,直接返回该类型;
最终两个分支的结果合并后就是CurrentType,完美匹配需求。这种方法兼容性强,即使联合类型后续新增其他同结构的成员也能正常工作。
方案二:排除数组类型
如果确定联合类型中仅包含目标类型和它的数组类型,可以直接用Exclude排除所有数组类型,得到剩余的基础类型:
type DesiredType = Exclude<ExportedType, any[]>; // 类型为 CurrentType
原理
Exclude<T, U>会从类型T中移除所有可赋值给U的成员,这里any[]匹配所有数组类型,所以会排除CurrentType[],剩下的就是CurrentType。
内容的提问来源于stack exchange,提问作者Tristan F.-R.
相关产品推荐
相关产品推荐

