I cannot understand you well, I think then. Whenever you 'typealias' a type the new name will always be replaced with the actual type name before it is further compiled. Your examples always converted to TypeA(...) -> SomeType(...) TypeB(...) -> SomeType(...) Since both have the same argument types and number arguments the last one will be the one used later. The most closest thing you can do is having 2 methods named TypeA and TypeB that constructs two different instances of SomeType.
type SomeType name::ASCIIString value::Int end #No 'typealiase's TypeA(x)=SomeType("A",x) TypeB(x)=SomeType("B",x) But TypeA and TypeB will not be 'type's. I may have not understood you well but definetely, you cannot achieve what you want with 'typealias'.