如何从TypeScript判别式联合创建其子集判别式联合?
在TypeScript判别式联合类型中创建子集联合类型
当然可以实现,你遇到的问题是因为Pick工具类型要求选取的字段必须存在于联合类型的所有成员中,而你要的是针对每个联合成员单独选取各自存在的字段。这里有两种简单的实现方式:
方法一:使用Omit去掉不需要的字段(更直接)
如果你的需求是去掉公共字段title和userId,保留其余字段,可以借助分布式条件类型实现逐个成员的Omit操作:
// 定义一个针对联合类型的Omit工具 type OmitFromUnion<T, K extends keyof any> = T extends infer U ? Omit<U, K> : never; // 生成目标类型 type ListingBrief = OmitFromUnion<Listing, 'title' | 'userId'>;
方法二:使用Pick选取需要的字段
如果需要精准指定每个成员要保留的字段,可以用类似的思路,对每个联合成员单独过滤出存在的目标字段:
// 定义针对联合类型的Pick工具 type PickFromUnion<T, K extends keyof any> = T extends infer U ? Pick<U, Extract<keyof U, K>> : never; // 生成目标类型 type ListingBrief = PickFromUnion<Listing, 'type' | 'dailyPrice' | 'monthlyPrice' | 'sellPrice'>;
原理说明
TypeScript的分布式条件类型会自动将联合类型拆分为单个成员处理。比如T extends infer U会遍历Listing的每个对象成员,对每个成员单独执行Omit或Pick操作,最后再将结果重新组合成联合类型,完美解决了Pick无法处理部分成员特有字段的问题。
内容的提问来源于stack exchange,提问作者hskris
相关产品推荐
相关产品推荐

