Rust port of the TypeScript 7 type checker
tsrs
tsrs is a drop-in replacement for the TypeScript 7 compiler and language server, written in Rust.
Our goal is 100% conformance, with much lower memory use and faster type checking. Read the announcement.
Get started
pnpm add -D tsrs
pnpm exec tsrs --noEmit
You can try tsrs today and give us feedback on performance, memory usage, and conformance.
Try checking and emitting code in the browser playground.
Conformance
The 0.19.0 source upgrade targets microsoft/TypeScript v7.1-beta at 3e9236361fa9.
We aim to release a stable version against TypeScript 7.1 with 100% conformance. In our testing on existing projects,
we have yet to find a correctness bug in tsrs.
There are known order issues: the pinned Go compiler can produce different diagnostics and traces depending on
parallel parse, resolution, and check order, while tsrs canonicalizes some checker history by default. For the
closest comparison, use --checkerAssignment go --noLazyMembers; tsgo parser and resolver races can still vary
between runs.
--init and --showConfig are not supported. See compatibility and evidence
for supported features and known gaps.
The seven watch-tuning flags removed by TypeScript 7 are rejected by tsrs as well.
The #623 source upgrade ports all 112 upstream commits and supports
source-phase import source and import.source() syntax. The last published release, 0.18.0, uses the earlier pin;
the 0.19.0 candidate pins the final commit. Its Node API exposes the project checker's merged, declaration, node,
and parent symbol lookups.
The source-31 SDK adds typed paths; source 58 promotes the SDK exports to tsrs/path, tsrs/sync,
tsrs/async, tsrs/ast, and tsrs/vscode for an explicitly selected API package.
The source-51 compiler reports TS18117 for deferred imports without a namespace binding, including in JavaScript.
Source 62 adds the ESNext iterator typings for chunks, join, includes, zip, and zipKeyed.
Source 101 creates private Unix API socket directories and restricts Windows API named pipes to the current user.
Source 102 makes sync SDK generator instances single-use across batch calls, matching upstream TypeScript.
Source 104 rejects network filesystem paths before OS access and reports TS5116 for affected config and source references.
Source 109 lets sync and async Node API clients write a timing snapshot on close when TS_API_TIMING_DIR is set.
Extra features
@tsrs/wasm provides WebAssembly support
targeting wasm32-wasip1 (WASI Preview 1).
Learn more
- CLI usage and memory tuning
- Editor setup
- Node API
- WebAssembly for Node and browsers
- Benchmarks and methodology
- Release notes
- Engineering notes
Contributing
The issue tracker is open for bug reports. Please include a minimal reproduction. Pull requests remain closed because we don't have the bandwidth to review them.
See the contributing guide for building from source and running the suites, the Code of Conduct, and security policy for reporting vulnerabilities.
Acknowledgments
We thank the following organizations and contributors:
- Depot CI for sponsoring our continuous integration.
- Owner.com for sponsoring the initial work.
- Max Schwenk for the port.
- @walkerdb for improvements to the project.
- @JiangWeixian for transferring the
tsrsnpm package name.
We extend special thanks to the TypeScript team for their support.
License
tsrs is a derivative of TypeScript (Copyright Microsoft Corporation), licensed under Apache-2.0.
The bundled lib.*.d.ts files are TypeScript's. See NOTICE for attribution.
Not affiliated with or endorsed by Microsoft.