TypeScript如何从对象联合类型中按属性值筛选提取子类型
结论
TypeScript 完全支持通过过滤逻辑从联合类型生成新类型,不需要手动重复枚举联合成员。
实现代码
直接使用内置的Extract工具类型即可完成目标:
// 提取NotificationState中所有kind为"dynamic"的成员 type DynamicNotificationState = Extract<NotificationState, { kind: "dynamic" }>;
生成的类型和你手动定义的预期DynamicNotificationState结构完全一致。
实现原理
- 该能力基于TypeScript的分布式条件类型特性实现
Extract的原生定义为:type Extract<T, U> = T extends U ? T : never- 当
T传入联合类型时,条件判断会自动拆解为对每一个联合成员的单独校验:匹配规则的成员会被保留,不匹配的成员会被判定为never,最终从联合结果中被自动剔除
维护收益
这种推导式的类型会和原NotificationState保持自动同步:后续给原联合新增任意kind: "dynamic"的成员时,DynamicNotificationState不需要手动修改就会自动包含这些新增内容,避免了多份类型手动维护导致的不一致问题。
内容的提问来源于stack exchange,提问作者jchi2241
相关产品推荐
相关产品推荐

