如何在TypeScript联合类型中排除某类的所有子类类型?
在TypeScript联合类型中移除继承自特定类的类型
你可以通过条件类型实现这个需求,核心思路是遍历联合类型的每个成员,判断其是否继承自目标类,将符合条件的类型替换为never(never在联合类型中会被自动剔除)。
具体实现如下:
class Failure {} class ParseFailure extends Failure {} class ExecutionFailure extends Failure {} type Success = { ok: true } type ExecutionResult = Success | ParseFailure | ExecutionFailure // 定义排除逻辑 type ExcludeFailures<T> = T extends Failure ? never : T // 验证结果:ExcludeFailures<ExecutionResult> 类型等价于 Success type Result = ExcludeFailures<ExecutionResult> // Result 的类型是 { ok: true }
原理说明
- TypeScript 的条件类型会自动分发到联合类型的每个成员上,相当于对
Success、ParseFailure、ExecutionFailure分别执行判断逻辑。 - 对于
ParseFailure和ExecutionFailure,它们的实例类型都继承自Failure,所以会被替换为never。 - 联合类型中的
never会被自动忽略,最终只剩下Success类型。
内容的提问来源于stack exchange,提问作者Duma - Stefano Gombi
相关产品推荐
相关产品推荐

