DEV Community

Cover image for TypeScript's Secret Parallel Universe

TypeScript's Secret Parallel Universe

Florian Reuschel on January 20, 2020

Almost four years ago, I was a new TypeScript user, amazed by the possibilities that this freshly learned JavaScript dialect opened up to me. But j...
Collapse
 
girvo profile image
Josh Girvin

TypeScript's "secret" scope was something I was also running into, but mainly because I was moving to it from Flow.

Flow isn't shy about there being "type land" and "code land", and never-the-twain-shall-meet. I really liked that separation, but there are upsides to how TS tackles it as well: just means we need to remember things like this post every so often haha

Collapse
 
loilo profile image
Florian Reuschel

Honestly, I'm glad I'm not the only one who has hit that brick wall. I didn't learn TypeScript very linearly (i.e. I did not read the official TS manual start to finish) but I was quite surprised that until today, I've never encountered an article mentioning this distinction.

Even Ryan in his GitHub comment did not point me to any RTFM-style URL, so I suppose this concept is just implicitly accepted without anybody talking about it that much. 🤷‍♂️

Collapse
 
girvo profile image
Josh Girvin

That was about my experience too. The biggest thing that threw me for a loop and made me realise that there was this "mixing" of concerns going on? import-ing types as if they're actual code... but they're not code! Flow has import type { ... which is much cleaner, but Typescript is so damned useful that it's silly to not use it.

Thread Thread
 
loilo profile image
Florian Reuschel

I don't even dislike the concept of mixing things up. It's pretty neat to be able to import a class which can be used as a constructor as well as a type.

But it obviously is less transparent and really carries the risk of newbies getting burned.

Thread Thread
 
orta profile image
Orta

Nice! TypeScript 3.8 (in beta ATM) has import type and it would give a compiler error if you used a type-ish import (like a class) from import type in a value position

Thread Thread
 
loilo profile image
Florian Reuschel

Interesting, didn't know that. 👍

For anyone wanting to read more: TypeScript 3.8 beta announcement

Collapse
 
svijaykoushik profile image
Vijay Koushik, S. 👨🏽‍💻

This is surprising. I, being a beginner in TypeScript thought that types were implicitly tied with the classes I defined. I thought types worked similar to Java where one imports a class also imports the type implicitly. Thanks for pointing out the "secret" in typescript.

Collapse
 
loilo profile image
Florian Reuschel

Your assumption is not wrong though! If a class has been declared in TypeScript, its value and its type do implicitly exist under the same name, therefore they're also imported together

But this is a rather special case for classes, most (all?) other entities do not create an implicit type alongside them.

Collapse
 
basarat profile image
Basarat Ali Syed

Not a secret. They are called declaration spaces : basarat.gitbook.io/typescript/proj... 🌹

Collapse
 
loilo profile image
Florian Reuschel

Of course not a secret. But as a title, it definitely sounds more appealing than "TypeScript's Lesser Known Parallel Universe". 😁
Thanks for the pointer to the official terminology though. 👍

Collapse
 
seangwright profile image
Sean G. Wright

This separation of values and types explains so many issues I've had over the years... especially with older type definition files and bundlers.

Thanks for the explanation!

Collapse
 
loilo profile image
Florian Reuschel

You're welcome. 🙂