tsrs is a Rust port of the TypeScript 7 type checker (the Go compiler, "tsgo"). Each row type-checks one project from microsoft/typescript-benchmarking, the suite the TypeScript team benchmarks tsgo on (vscode, xstate-main, webpack, mui-docs, Compiler, Compiler-Unions), with tsgo 7.0.2 (npm typescript@7.0.2) and with tsrs at commit 4c5ad9de536a: tsc -p <project> --noEmit, median of 3 interleaved runs, on Depot CI depot-ubuntu-24.04-8 (8 vCPU, 31 GB RAM, Linux x86_64, AMD EPYC 9R45 96-Core Processor).

Default mode: 4 checker threads in both (tsrs also resolves members lazily, its default)

--singleThreaded: one checker thread in both

errors: the number of type errors each compiler reports on the project; they must be equal (a bold cell is a disagreement, i.e. a correctness bug). wall: process wall-clock time. speedup: tsgo wall / tsrs wall (above 1 = tsrs faster). peak memory: maximum resident set size. memory, tsrs / tsgo: below 1 = tsrs uses less.

(ref N): tsgo 7.0.2 and tsrs disagree, but typescript@7.1.0-dev.20260930.4, built from the TypeScript commit tsrs ports (b85298b6), reports exactly tsrs's errors: a TypeScript 7.0 vs 7.1-dev difference, not a tsrs bug.

Runner: Depot CI depot-ubuntu-24.04-8 (8 vCPU, 31 GB RAM, Linux x86_64, AMD EPYC 9R45 96-Core Processor). Date: 2026-10-01 15:53 UTC. tsrs commit: 4c5ad9de536a. Numbers from shared CI machines are noisy; compare trends, not single runs. How it is measured: bench/README.md.

A Rust port of the TypeScript 7 type checker. It is tsc --noEmit: same flags, same tsconfig, same diagnostics,

byte for byte. No emit, no language service.

It ports the Go implementation in microsoft/TypeScript (tsc/internal)

at commit b85298b6a81f function for function, and the Go code is the specification: on the TypeScript conformance

suite the output matches the reference on 13,458 of 13,462 error baselines and on all 12,779 .types and .symbols

baselines; the four exceptions are test-harness artifacts. docs/STATUS.md has the details and the comparison on a

38k-file production codebase.

npx -y @maschwenk/tsrs -p path/to/project # macOS arm64/x64, Linux x64

npx -y @maschwenk/tsrs -p . --singleThreaded # one checker thread (less memory)or pnpm add -D @maschwenk/tsrs and run tsrs from scripts. --extendedDiagnostics prints the usual counters.

By default tsrs also runs with checker changes that are not merged upstream yet; --noLazyMembers turns them

off and gives the reference-identical mode. None of them changes any diagnostic (verified on the whole conformance

suite, errors, types and symbols):

- build member tables of instantiated classes/interfaces lazily (microsoft/TypeScript#64475)

- build members of keyof mapped types lazily (microsoft/TypeScript#64526)

- give tuple references lazy member tables

- answer empty-object checks from lazy member tables

- find unmatched properties without instantiating a lazy target's members

- don't copy union/intersection properties into the augmented property cache

- instantiate conditional types without a combined mapper for the cache lookup

The last five are Go patches prepared from this port, not yet opened upstream (upstream/).

cargo build --release -p tsrs_cli -p tsrs_testrunner

./target/release/tsrs -p path/to/project

./target/release/tsrs-test run --suite all --baselines types,symbols # conformance suite, ~20 sCONTRIBUTING.md covers the workflow; docs/PORTING.md, docs/AST.md and docs/CHECKER.md the conventions;

tools/oracle/ the Go oracle programs that compare each stage against the reference.

Derivative work of microsoft/TypeScript (Copyright Microsoft Corporation), Apache-2.0 like the original

(LICENSE, NOTICE); the bundled lib.*.d.ts files are TypeScript's. Not affiliated with or endorsed by

Microsoft. The port was written largely by AI coding agents directed and reviewed by Max Schwenk; its correctness

rests on the evidence above rather than on review alone.