No magic involved
While this might initially seem like magic, once you get to the heart of the matter, it is really pretty straight forward.
New types are created by combining instances of primitive types and instances of previously existing user-defined new types.