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...
For further actions, you may consider blocking this person and/or reporting abuse
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
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. 🤷♂️
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 hasimport type { ...
which is much cleaner, but Typescript is so damned useful that it's silly to not use it.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.
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) fromimport type
in a value positionInteresting, didn't know that. 👍
For anyone wanting to read more: TypeScript 3.8 beta announcement
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.
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.
Not a secret. They are called declaration spaces : basarat.gitbook.io/typescript/proj... 🌹
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. 👍
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!
You're welcome. 🙂