Node.js v23.6.0 was recently released, and it comes with a significant update: the unflagging of --experimental-strip-types
. This means Node.js can now run TypeScript files natively without any additional configuration.
TypeScript enhances JavaScript by introducing optional static typing and advanced features such as interfaces, generics, and type inference. Over the years, it has become the de facto standard for large-scale JavaScript applications. With this integration into Node.js, TypeScript becomes even more accessible to backend developers.
To execute a TypeScript file in Node.js, simply run:
node index.ts
In addition to .ts
files, Node.js also supports .mts
and .cts
files, but .tsx
is not supported.
Node.js uses a version of swc
to strip out the type annotations, leaving plain JavaScript code that it can execute.
When using TypeScript in an environment without a bundler, you might have previously written imports like this:
import { myFunction } from './my-module.js';
instead of from './my-module.ts'
Why is that? The TypeScript compiler would not modify module extensions like './my-module.js'
, so developers had to use extensions that aligned with the transpiled JavaScript output.
However, since Node.js uses file extensions to determine the module type, you must explicitly reference TypeScript files in your imports:
import { myFunction } from './my-module.ts';
This change is necessary because Node.js relies on file extensions to determine the module type. In contrast, the TypeScript compiler previously left module specifiers like './my-module.js'
unchanged, requiring developers to adapt to the transpiled output.
Node.js does not perform type checking when running TypeScript files. To ensure type safety, you'll need to run the TypeScript compiler (tsc
) or a similar tool locally, for example:
tsc --watch
Additionally, configuring your tsconfig.json
correctly is crucial for consistency between type checking and coding:
{
"compilerOptions": {
"target": "esnext",
"module": "nodenext",
"allowImportingTsExtensions": true,
"rewriteRelativeImportExtensions": true,
"verbatimModuleSyntax": true
}
}
allowImportingTsExtensions
: Enables importing .ts
files directly instead of importing .js
.rewriteRelativeImportExtensions
: Rewrites relative imports from .ts
files to relative imports from .js
files.verbatimModuleSyntax
: Warns if we don't use the type
keyword when importing a type.type
Keyword Must Be Used to Import Typestype
keyword is necessary when importing types - otherwise type stripping won’t remove them.
// Type import
import type { Item } from './my-module.ts';
// Inline type import
import { myFunction, type Item } from './my-module.ts';
Certain TypeScript-specific features are not supported, including:
To enable these features, you can add the --experimental-transform-types
flag.
TypeScript allows running upcoming JavaScript features (e.g., decorators) on current JavaScript engines, by transpiling them.
However, since Node.js only strips TypeScript types, such features are not supported.
According to Marco on X, TypeScript support will be coming to to Node.js v22 but not to v20.
Leapcell is the Next-Gen Serverless Platform for Web Hosting, Async Tasks, and Redis:
Multi-Language Support
Deploy unlimited projects for free
Unbeatable Cost Efficiency
Streamlined Developer Experience
Effortless Scalability and High Performance
Explore more in the Documentation!
Follow us on X: @LeapcellHQ