S.union is obviously unaware of the interface and only uses the type. I find myself creating union types that are a union of the interfaces above rather than using S.Schema.To<typeof MyUnion> but then I frequently have to map my effects with .map(e => e as MyUnion) so it uses the handrolled union type. Here is a small example of what I mean: