I.e., it does not matter that typeof(x) will return (and print) String as its just the same an XString per the assignment XString = String. If there is no need to ever reassign the type alias, I would probably use const XString = String which makes it even more clear that XString is just an alternative name for String.
Note that this also means that your code will work with regular strings as there is no way to ever distinguish them from XStrings. If it is required that they are separate types, you will need to create a new type as suggested by @jling and define all methods required on that type, e.g., by forwarding to the underlying data field:
struct MyXString
data::String
end
Base.:*(u::MyXString, v::MyXString) = MyXString(u.data * v.data)