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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:12:57