You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:03:18