When a rose by any other name would do
TypeScript provides structural typing. If it walks like a duck, and quacks like a duck, for TypeScript, it is a duck. TypeScript does not care at all what name you give to the type.
Haskell provides nominal typing. It must be called a duck for it to be considered a duck. A rose by any other name won’t do.
Both TypeScript and Haskell are based on solid, grounded, mathematics that goes back a century at least. It is not programmers hacking these languages together on whim and fashion (though that plays a part) - it is more of people trying to transmute the hard nuggets of type theory into practical programming languages.
Both TypeScript and Haskell provide type inference. Which means that you won’t need to tell the compiler the type of a duck or a rose, it’ll just know.
But the surprising thing is, after a while you’ll want to write the types. Programming in these languages then becomes the game of describing the types and how they transform into each other (as opposed to more direct approach of describing values and how they transform into each other).