I think if you expect to be using discriminated union types, then you will get better behavior if your user-defined type guard returns a type like val is Extract<DiscriminatedUnionType, {discriminant: LiteralDiscriminant}> instead of intersections like val is DiscriminatedUnionType & {discriminant: LiteralDiscriminant} (or the one with Omit<DiscriminatedUnionType , "discriminant"> & {discriminant: