Readit News logoReadit News
jauco · a month ago
Newer versions of node can run typescript directly[1]. The one where types are simply stripped is considered stable[2] (but you can’t use syntax that node doesn’t understand, such as enums).

They’re working on making features work that require some transpilation as well

[1]: https://nodejs.org/en/learn/typescript/run-natively [2]: https://github.com/nodejs/node/pull/58643

eyelidlessness · a month ago
Completely picking nits: Node doesn’t understand types at all, the distinction is between what TypeScript now calls “erasable syntax”[1] versus syntax excluded by that. The exclusion of enum isn’t likely to affect many projects (because enum has long been panned by most users). Same with namespace. By far the most likely incompatibility is “parameter properties”, ie class fields assigned in the constructor signature.

1: https://www.typescriptlang.org/tsconfig/#erasableSyntaxOnly

veidr · a month ago
This is exactly right, and the constructor parameter incompatibility is a big deal. The other two aren't nothing, either, even if enums are generally not the prevailing best practice in most cases.

This is an interesting development, but it's not really "running TypeScript code" its "almost running TypeScript code".

With alternative runtimes like Deno and Bun able to run real TypeScript code (and type check it, lint it, test it, etc) using a slightly watered-down, not-fully-compatible dialect of TypeScript, just so that it can run on Node without a build step, really isn't a very compelling argument.

It'd be different if TypeScript announced "TypeScript will remove these features to work around Node's limitation — compatibility is more important", but they haven't.

(And I wouldn't personally love it if they did. Deno and Bun are ahead of Node on several different axes, and other runtimes are coming, too — if Node can catch up, then great, but if it can't, then it should rightly be left behind.)

There's still no real alternative to Node for many large frontend apps in production, but for a lot of other TypeScript use cases — build tooling, backend APIs, CLI apps, edge functions — modern TypeScript in the Deno/Bun style (ESM, full filename imports, run/typecheck/lint/test with no user-configured build step) has significant benefits.

Both Deno and Bun have extensive — and necessary — backward compatibility shims to enable interoperability with what I've started calling "legacy Node JS/TS". You can use the Node APIs (but should explicitly import those things with "node:" in your import specifier. You can use NPM packages (even CommonJS ones, although Deno prohibits CommonJS in new code, a stricter line than Bun draws).

I don't think using Deno and Bun is a huge bet on those specific (VC-backed) runtimes, either, because there is a shared vision of what "modern TypeScript" looks like, it works with both of those tools, and I think there will be multiple runtimes that support that vision for as long as TypeScript is relevant, even if both Deno and Bun were to go sideways.

Whether Node itself will become one of those modern runtimes is an interesting question. This is a step in that direction, it looks like, but it's still an open question.

nsonha · a month ago
> enum has long been panned by most users). Same with namespace

Why? Would you would rather do a smurf naming convention than having your consts, DTOs, events, errors and what not neatly organized under the name of the function that uses it?

alpinisme · a month ago
Some people hate enums but they’re the only easy form of nominal typing in typescript, and for that alone you can pry them from my cold dead hands.
ethan_smith · a month ago
The --experimental-strip-types flag is actually stable in Node.js 22 (released May 2024), so you can run TypeScript directly with `node --strip-types file.ts` without the experimental prefix. This makes Node's native TypeScript support even more practical for everyday use.
linkage · a month ago
Node.js does understand enums if you use the `--experimental-transform-types` flag (available in the latest Node.js LTS release). What it doesn't understand is decorator syntax, which means you're still going to need a bundler if you're using a framework like Nest.js or Inversify.
theThree · a month ago
It still have issues. Example: `import foo from "./Foo"` doesn't work. You have to `import foo from "./Foo.ts"`
veidr · a month ago
That's a feature, not a bug.

When you think about it (even drunk as hell while mid-fall bungee jumping) the latter form is sensible and the first is nuts.

chmod775 · a month ago
That's some terrible naming. Now there's two things "tsx" stands for in the TypeScript ecosystem.
VPenkov · a month ago
Been using tsx for years. This had never occurred to me, but you're right
conradkay · a month ago
It took me a couple seconds to figure out what they even meant (.tsx for React) so it's probably not really a bad name.
subarctic · a month ago
Yup. But it's useful so I use it
low_tech_punk · a month ago
To make matters worse, there is actually a third thing named "TSX" gaining traction right now:

https://esm.sh/#tsx

jasonjmcghee · a month ago
That's the same tsx as the tsx people use with react.

Typescript XML

low_tech_punk · a month ago
I don't think it's accurate to say "without worrying about configuration". The next line is more accurate:

> tsx runs your TypeScript code with modern and sensible defaults, making it user-friendly and especially great for beginners.

You'd still have to worry about config if you want to make adjustment and when that happens, the implicit smart defaults become a friction point.

It might also surprise you with errors when you attempt to bundle the code. It'd be nice to have tsx available at runtime so I can run TypeScript code without worrying about the transpiler

nailer · a month ago
> You'd still have to worry about config if you want to make adjustment and when that happens, the implicit smart defaults become a friction point.

In practice (when using tsx and when using a similar prececessor tech, esrun) ES moves forwards, not backwards.

Is your target "supported node.js and current browsers"? Today's tsx defaults work with that. They'll also work with tomorrows node.js and current browsers.

keysdev · a month ago
esno seems a better alternative. esbulit has already solve much of that for devs.
dimgl · a month ago
tsx is such an amazing tool. A couple of years ago I discovered it and abandoned ts-node and all of the alternatives. I still use it today and I was a sponsor for many months.

Thanks again to the author. It has saved me (and my team) dozens of hours. And I was able to replace all of my ESBuild workarounds that I had made to easily run TypeScript. Cheers.

90s_dev · a month ago
Note that you can also get TSX in native Node.js with minimal configuration[0]. This is accomplished via module hooks and TypeScript's own compiler (or bring your own compiler like swc).

[0]: https://github.com/sdegutis/immaculata

kylecordes · a month ago
A challenge with TSX, and as I understand other similar tools, is that it doesn't support TypeScript decorator metadata. A few years ago, libraries using that started to get popular, so many older projects have a significant obstacle to moving away from running the TypeScript compiler JS output.

Starting a new project today, I think the right move is to use TSX or Bun or whatever. You want a roadblock at the very first moment you start trying one of these limited compatibility libraries, Because it won't work and then you'll pick a different library that doesn't rely on non-erasable TypeScript syntax.

WorldMaker · a month ago
The libraries that started to get popular using decorators years ago were using an --experimental compiler flag and should have known better than push that into production usages.

There's a Stage 3 decorators that now compiles in Typescript (>5.0) out of the box without an --experimental compiler flag, but it is subtly incompatible with that old experimental dialect and it will take some time before all those libraries catch up, if they catch up.

It won't run in Node (or this TSX) just yet because I believe Node waits for Stage 4 before enabling language features. (Deno has an experimental flag for it, as Deno supports Stage 3 features behind experimental flags.)

pas · a month ago
is support not even planned (realistically possible?) in these fast transpilers (like esbuild, used by tsx, right?)
WorldMaker · a month ago
As far as I know the current bottleneck is Decorators are still only Stage 3, so the transpilers can transpile it as is (which I believe esbuild already does), but Node won't support running it until Stage 4.
hu3 · a month ago
I was curious about how it works.

It seems to be a wrapper for esbuild that transpiles typescript then calls your local node (it doesn't bundle nodejs).

From https://tsx.is/faq :

"tsx: Uses esbuild for fast compilation and does not perform type checking."

From https://tsx.is/node-enhancement :

"Under the hood, tsx calls node. This means the Node.js features supported in tsx depend on the Node.js version you have installed."