Technology4 min read

tsc-ts: TypeScript written in TypeScript

By · Published by Everything Blog

In short

tsc-ts is a new TypeScript port that allows developers to use TypeScript's features and syntax within the TypeScript ecosystem, making it easier to integrate TypeScript into existing projects.

Key points

  • A new TypeScript port called tsc-ts has been written in TypeScript, allowing developers t…: A new TypeScript port called tsc-ts has been written in TypeScript, allowing developers to use the language's features and syntax within the TypeScript ecosystem.
  • The tsc-ts package includes a command-line interface (`tsc-ts`) and a server (`--api`) th…: The tsc-ts package includes a command-line interface (`tsc-ts`) and a server (`--api`) that can be used with tools like scriptc.
  • It compiles TypeScript code to native machine code and supports TypeScript's test suite,…: It compiles TypeScript code to native machine code and supports TypeScript's test suite, including 12,500 files and 17,000 unit tests.

Sources checked by our analysis pipeline: 1

An experimental TypeScript port of the TypeScript 7.0.2 compiler (TypeScript-Go, or tsgo), compiled to native code with scriptc.

Install the compiler from npm:

npm install -D tsc-ts

npx tsc-ts -p tsconfig.json

The tsc-ts

package runs a native executable from a per-platform optional dependency (@tsc-ts/darwin-arm64

, @tsc-ts/linux-x64-gnu

, …). See packages/tsc-ts

.

See CHANGELOG.md for release notes and GitHub Releases for package archives.

To build the packages for the current platform:

npm run pack:npm -w tsc-ts # packages/tsc-ts/dist/npm/*.tgz

npm run pack:npm -w tsc-ts -- --check # also install the tarballs and compile a project

-- --binary dist/tsc

packs an existing native build, relative to packages/tsc-ts

, instead of building one.

Package | Description |

---|---|

packages/tsc-ts |

The compiler, written in TypeScript, with the tsc-ts command line and --api server. |

packages/tsgo |

Reference builds of tsgo (its command line and per-stage drivers) that the tests compare against. |

Tasks run with Turborepo.

apps/web

contains the tsc-ts compiler guides.

npm run dev:web

npm run build:web

- Node.js 24+ and npm

- Go 1.26

- A scriptc host: macOS, Linux, or Windows, with

clang

available for linking

npm ci

npm run fetch:upstream # clone tsgo at the pinned commit

npm run build # the Node build of tsc-ts (packages/tsc-ts/dist) and the documentation site

npm run build:oracle # tsgo reference builds in packages/tsgo/dist

package.json

pins scriptc 0.3.5

, with its @scriptc/threads

package. The build fails with any other version.

packages/tsc-ts/src/compiler

is the compiler, ported from tsgo 7.0.2 as idiomatic TypeScript. Each part is compared with tsgo on TypeScript's test corpus (about 12,500 files, 17,000 units after splitting multi-file cases):

Part | Compared with tsgo | Status |

---|---|---|

Scanner | tokens, values, errors, rescans, JSDoc | all files match |

Parser and AST | tree, diagnostics, API source file encoding | all units match |

Binder | symbols, tables, flow graph, name resolution | all units match |

Module resolution | results, package IDs, --traceResolution |

all requests match |

tsconfig.json and programs |

--showConfig , --listFilesOnly , --explainFiles |

all cases match |

Command line and options | output, errors, exit codes, --locale |

all cases match |

Diagnostics catalog | messages, 13 translations, output formats | all match |

JavaScript emit | emitted files, 39 option sets | all compared units match |

Declaration emit | .d.ts and .d.ts.map output, declaration errors |

all units match |

--build , --incremental |

output, .tsbuildinfo , emitted files, --watch |

all scenarios match |

Type checker | diagnostics per file | all files match |

The corpus scripts are in packages/tsc-ts/scripts

(*-corpus.mjs

).

tsc-ts --api

serves the same API as TypeScript 7.0.2's tsc --api

, over stdin and stdout, so tools that drive tsc --api

(such as scriptc) can run tsc-ts

instead.

npm run build -w tsc-ts

node packages/tsc-ts/dist/tsc-ts/src/main.js --api --cwd path/to/project

Native builds read lib files from the executable's directory, or from TSC_TS_LIB_DIR

:

npm run build:native -w tsc-ts # packages/tsc-ts/dist/tsc

npm run build:native:dev -w tsc-ts # unoptimized, faster to build

TSC_TS_LIB_DIR=upstream/typescript-go/internal/bundled/libs packages/tsc-ts/dist/tsc -p path/to/project

TSC_TS_BIN=packages/tsc-ts/dist/tsc

runs the tsc-ts tests that take a native build against it.

The server is checked against tsc --api

7.0.2 response by response, and scriptc builds the same programs with either. It runs on the tsc-ts compiler, natively or under Node.

Language service methods are supported: getCompletionsAtPosition

, getJsDocTags

, getDocumentationComment

, getReferencesToSymbolInFile

, getReferencedSymbolsForNode

and getSignatureUsages

. Like tsc --api

, completions that need auto imports (global identifiers, import statements, exhaustive switch

cases) report completion list needs auto imports

. The profiling methods (startCPUProfile

, stopCPUProfile

, saveHeapProfile

) are not supported.

npm test # compare tsc-ts with tsgo

npm run bench -w tsc-ts # time tsc-ts against tsgo and TypeScript's JavaScript compiler

npm run lint # oxlint

npm run format # oxfmt

Apache-2.0. See THIRD_PARTY_NOTICES.md for TypeScript-Go and other third-party notices.

Original source: github.com

Technology