为什么对组件属性使用Omit/Require后可辨识联合不再生效?
问题产生原因
TypeScript 内置的 Omit 工具类型不支持分布式处理联合类型,它的实现逻辑是对传入的类型整体做属性过滤:
// 内置 Omit 的底层实现 type Omit<T, K extends string | number | symbol> = { [P in Exclude<keyof T, K>]: T[P]; };
当 T 是可辨识联合类型时,keyof T 只会返回所有联合成员共有的属性名,过滤后生成的是单一的新对象类型,原有的联合结构会被完全抹除。你示例中的原 FieldProps 是由 SelectInputProps、TextInputProps 组成的联合类型,经过内置 Omit 处理后,类型不再是联合结构,自然无法通过 type 属性做类型窄化。
解决方法
自定义支持分布式处理的 Omit 工具类型,利用 TypeScript 分布式条件类型的特性,让属性过滤操作作用于联合的每一个成员:
type DistributiveOmit<T, K extends keyof any> = T extends any ? Omit<T, K> : never;
替换原有的类型定义即可:
type FieldProps = DistributiveOmit<ComponentProps<typeof Field>, 'size'>;
替换后原有的可辨识联合类型结构会被保留,type 属性的类型窄化逻辑会恢复正常。
内容的提问来源于stack exchange,提问作者corvid
相关产品推荐
相关产品推荐

