Because, in your example, an Int is not a subtype of String. Think about it like sets. You have the set of all Int unioned with all AbstractString. This is clearly bigger than the set of String. In fact you have:

Exactly, IntOrString is not a type or a DataType , its more like a function on Types, but is not itself a type , hence the raise an error make sense to me

Unions not being of type DataType has nothing to do with the fact that IntOrString <: String == false.

Let’s say you have a cage whose dweller has the type const HamsterOrBird = Union{Hamster, AbstractBird}. When you ask HamsterOrBird <: Canary, it means “if I know that there is a HamsterOrBird in the cage, can I be sure that the caged creature is a Canary?”

Maybe you meant the subtyping in the opposite direction? IntOrString >: String is true, meaning that if x isa String then x isa IntOrString.