如何从LogInResult联合类型中剔除{type: 'cancel'}类型?
如何从联合类型中剔除指定成员类型
当然可行!你碰到的问题是因为Omit工具类型的定位是移除单个对象类型的属性,而不是用来筛选联合类型里的成员。咱们换个正确的姿势,用TypeScript内置的工具类型就能轻松搞定。
先回顾一下你的原类型定义:
export declare type LogInResult = { type: 'cancel'; } | { type: 'success'; accessToken: string | null; idToken: string | null; refreshToken: string | null; user: GoogleUser; };
方法一:用Extract提取目标类型
直接筛选出联合类型中type为'success'的成员:
type SuccessLoginResult = Extract<LogInResult, { type: 'success' }>;
Extract是TS专门用来从联合类型中提取符合指定约束的成员的工具类型,这里通过{ type: 'success' }这个类型约束,精准匹配到联合里的成功登录结果类型。
方法二:用Exclude剔除不需要的类型
反过来,把type为'cancel'的成员从联合类型里排除掉:
type SuccessLoginResult = Exclude<LogInResult, { type: 'cancel' }>;
Exclude的作用和Extract相反,它会移除联合类型中匹配指定类型的成员,剩下的自然就是你想要的成功登录结果类型。
为什么你的Omit写法不生效?
Omit<T, K>的第二个参数K要求是属性名的联合字符串(比如'type'),它的功能是从单个对象类型T里移除指定属性,而不是处理联合类型的成员筛选。所以你用{ type: 'cancel' }作为第二个参数,TS根本无法识别你要做什么,自然就没效果啦。
内容的提问来源于stack exchange,提问作者Noitidart
相关产品推荐
相关产品推荐

