-
-
Notifications
You must be signed in to change notification settings - Fork 35.4k
module: add --experimental-strip-types #53725
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
nodejs-github-bot
merged 8 commits into
nodejs:main
from
marco-ippolito:feat/typescript-support
Jul 24, 2024
Merged
Changes from 1 commit
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
4c3f0da
module: add --experimental-strip-types
marco-ippolito 13ecb1d
module: prevent type-stripping in node_modules
marco-ippolito 9cff416
deps: update swc to 1.7.0-rc.0
marco-ippolito fe7c55f
deps: update swc to 1.7.0-rc.1
marco-ippolito 17c49ca
deps: update swc to 1.7.0
marco-ippolito 346e584
deps: swap swc with amaro
marco-ippolito f6d38e4
doc: move ts doc to standalone page
marco-ippolito 68153cc
fixup! review
marco-ippolito File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
doc: move ts doc to standalone page
Author: Marco Ippolito <marcoippolito54@gmail.com> Co-authored-by: Geoffrey Booth <webadmin@geoffreybooth.com> Date: Tue Jul 23 21:03:39 2024 -0700
- Loading branch information
commit f6d38e4cd16d2b538056f27216c8927f0b091aad
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,153 @@ | ||
| # Modules: TypeScript | ||
|
|
||
| ## Enabling | ||
|
|
||
| There are two ways to enable runtime TypeScript support in Node.js: | ||
|
|
||
| 1. For [full support][] of all of TypeScript's syntax and features, including | ||
| using any version of TypeScript, use a third-party package. | ||
|
|
||
| 2. For lightweight support, you can use the built-in support for | ||
| [type stripping][]. | ||
|
|
||
| ## Full TypeScript support | ||
|
|
||
| To use TypeScript with full support for all TypeScript features, including | ||
| `tsconfig.json`, you can use a third-party package. These instructions use | ||
| [`tsx`][] as an example but there are many other similar libraries available. | ||
|
|
||
| 1. Install the package as a development dependency using whatever package | ||
| manager you're using for your project. For example, with `npm`: | ||
|
|
||
| ```bash | ||
| npm install --save-dev tsx | ||
| ``` | ||
|
|
||
| 2. Then you can run your TypeScript code via: | ||
|
|
||
| ```bash | ||
| npx tsx your-file.ts | ||
| ``` | ||
|
|
||
| Or alternatively, you can run with `node` via: | ||
|
|
||
| ```bash | ||
| node --import=tsx your-file.ts | ||
| ``` | ||
|
|
||
| ## Type stripping | ||
|
|
||
| <!-- YAML | ||
| added: REPLACEME | ||
| --> | ||
|
|
||
| > Stability: 1.0 - Early development | ||
|
|
||
| The flag [`--experimental-strip-types`][] enables Node.js to run TypeScript | ||
| files that contain only type annotations. Such files contain no TypeScript | ||
| features that require transformation, such as enums or namespaces. Node.js will | ||
| replace inline type annotations with whitespace, and no type checking is | ||
| performed. TypeScript features that depend on settings within `tsconfig.json`, | ||
| such as paths or converting newer JavaScript syntax to older standards, are | ||
| intentionally unsupported. To get fuller TypeScript support, including support | ||
| for enums and namespaces and paths, see [Full TypeScript support][]. | ||
|
|
||
| The type stripping feature is designed to be lightweight. | ||
| By intentionally not supporting syntaxes that require JavaScript code | ||
| generation, and by replacing inline types with whitespace, Node.js can run | ||
| TypeScript code without the need for source maps. | ||
|
|
||
| ### Determining module system | ||
|
|
||
| Node.js supports both [CommonJS][] and [ES Modules][] syntax in TypeScript | ||
| files. Node.js will not convert from one module system to another; if you want | ||
| your code to run as an ES module, you must use `import` and `export` syntax, and | ||
| if you want your code to run as CommonJS you must use `require` and | ||
| `module.exports`. | ||
|
|
||
| * `.ts` files will have their module system determined [the same way as `.js` | ||
| files.][] To use `import` and `export` syntax, add `"type": "module"` to the | ||
| nearest parent `package.json`. | ||
| * `.mts` files will always be run as ES modules, similar to `.mjs` files. | ||
| * `.cts` files will always be run as CommonJS modules, similar to `.cjs` files. | ||
| * `.tsx` files are unsupported. | ||
|
|
||
| As in JavaScript files, [file extensions are mandatory][] in `import` statements | ||
| and `import()` expressions: `import './file.ts'`, not `import './file'`. Because | ||
| of backward compatibility, file extensions are also mandatory in `require()` | ||
| calls: `require('./file.ts')`, not `require('./file')`, similar to how the | ||
| `.cjs` extension is mandatory in `require` calls in CommonJS files. | ||
|
|
||
| The `tsconfig.json` option `allowImportingTsExtensions` will allow the | ||
| TypeScript compiler `tsc` to type-check files with `import` specifiers that | ||
| include the `.ts` extension. | ||
|
|
||
| ### Unsupported TypeScript features | ||
|
|
||
| Since Node.js is only removing inline types, any TypeScript features that | ||
| involve _replacing_ TypeScript syntax with new JavaScript syntax will error. | ||
| This is by design. To run TypeScript with such features, see | ||
| [Full TypeScript support][]. | ||
|
|
||
| The most prominent unsupported features that require transformation are: | ||
|
|
||
| * `Enum` | ||
| * `experimentalDecorators` | ||
| * `namespaces` | ||
| * parameter properties | ||
|
|
||
| In addition, Node.js does not read `tsconfig.json` files and does not support | ||
| features that depend on settings within `tsconfig.json`, such as paths or | ||
| converting newer JavaScript syntax into older standards. | ||
|
|
||
| ### Importing types without `type` keyword | ||
|
|
||
| Due to the nature of type stripping, the `type` keyword is necessary to | ||
| correctly strip type imports. Without the `type` keyword, Node.js will treat the | ||
| import as a value import, which will result in a runtime error. The tsconfig | ||
| option [`verbatimModuleSyntax`][] can be used to match this behavior. | ||
|
|
||
| This example will work correctly: | ||
|
|
||
| ```ts | ||
| import type { Type1, Type2 } from './module.ts'; | ||
| import { fn, type FnParams } from './fn.ts'; | ||
| ``` | ||
|
|
||
| This will result in a runtime error: | ||
|
|
||
| ```ts | ||
| import { Type1, Type2 } from './module.ts'; | ||
| import { fn, FnParams } from './fn.ts'; | ||
| ``` | ||
|
|
||
| ### Non-file forms of input | ||
|
|
||
| Type stripping can be enabled for `--eval` and STDIN input. The module system | ||
| will be determined by `--input-type`, as it is for JavaScript. | ||
|
|
||
| TypeScript syntax is unsupported in the REPL, `--print`, `--check`, and | ||
| `inspect`. | ||
|
|
||
| ### Source maps | ||
|
|
||
| Since inline types are replaced by whitespace, source maps are unnecessary for | ||
| correct line numbers in stack traces; and Node.js does not generate them. For | ||
| source maps support, see [Full TypeScript support][]. | ||
|
|
||
| ### Type stripping in dependencies | ||
|
|
||
| To discourage package authors from publishing packages written in TypeScript, | ||
| Node.js will by default refuse to handle TypeScript files inside folders under | ||
| a `node_modules` path. | ||
|
|
||
| [CommonJS]: modules.md | ||
| [ES Modules]: esm.md | ||
| [Full TypeScript support]: #full-typescript-support | ||
| [`--experimental-strip-types`]: cli.md#--experimental-strip-types | ||
| [`tsx`]: https://tsx.is/ | ||
| [`verbatimModuleSyntax`]: https://www.typescriptlang.org/tsconfig/#verbatimModuleSyntax | ||
| [file extensions are mandatory]: esm.md#mandatory-file-extensions | ||
| [full support]: #full-typescript-support | ||
| [the same way as `.js` files.]: packages.md#determining-module-system | ||
| [type stripping]: #type-stripping | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.