A typescript-go toolchain for compiler-powered plugins and type-safe execution.
Benchmarked against the legacy tsc + eslint/prettier path on real repositories; see the benchmark guide for per-project ratios.
ttsc: build, check, and transform.ttsx: execute TypeScript with type checking.- native TypeScript-Go execution instead of transpile-only runners.
- type checking that
tsxdoes not provide.
@ttsc/lint: replaceseslintandprettier.- lint violations as TS compile errors.
- format autofixes via
ttsc format.
- plugin support: compiler-powered libraries, such as
typia.
Setup
Install
Install ttsc, @ttsc/lint, and the native TypeScript preview package:
npm install -D ttsc @ttsc/lint @typescript/native-preview
Commands
Run TypeScript directly with ttsx (CLI command):
Build, check, or watch the project with ttsc:
npx ttsc npx ttsc --noEmit npx ttsc --watch
Rewrite source files in place with the @ttsc/lint format rules:
VS Code Extension
Install the VS Code extension for live TypeScript-Go editor features plus saved-state ttsc plugin diagnostics and actions.
Install it from the VS Code Marketplace by searching ttsc, or run:
Then turn on format-on-save in .vscode/settings.json:
Lint fixes stay off-save by default; opt in with "editor.codeActionsOnSave": { "source.fixAll.ttsc": "explicit" }.
See @ttsc/vscode for requirements and settings.
Bundlers
Use @ttsc/unplugin when a bundler owns your build.
It runs ttsc plugins inside supported bundlers.
npm install -D ttsc @ttsc/lint @typescript/native-preview npm install -D @ttsc/unplugin
Minimal Vite setup:
// vite.config.ts import ttsc from "@ttsc/unplugin/vite"; import { defineConfig } from "vite"; export default defineConfig({ plugins: [ttsc()], });
Supported bundlers:
- Vite
- Rollup
- Rolldown
- esbuild
- Webpack
- Rspack
- Next.js
- Farm
- Bun
See @ttsc/unplugin for full setup and adapter options.
Plugins
Plugins let libraries add compile-time checks, transforms, and type-driven code generation to normal ttsc and ttsx runs.
# compile npx ttsc # execute npx ttsx src/index.ts
Transform Example
A transform uses TypeScript types to generate JavaScript before runtime.
import typia, { tags } from "typia"; import { v4 } from "uuid"; const matched: boolean = typia.is<IMember>({ id: v4(), email: "samchon.github@gmail.com", age: 30, }); console.log(matched); // true interface IMember { id: string & tags.Format<"uuid">; email: string & tags.Format<"email">; age: number & tags.Type<"uint32"> & tags.ExclusiveMinimum<19> & tags.Maximum<100>; }
The transform replaces typia.is<IMember>() with dedicated JavaScript checks at build time:
import typia from "typia"; import * as __typia_transform__isFormatEmail from "typia/lib/internal/_isFormatEmail"; import * as __typia_transform__isFormatUuid from "typia/lib/internal/_isFormatUuid"; import * as __typia_transform__isTypeUint32 from "typia/lib/internal/_isTypeUint32"; import { v4 } from "uuid"; const matched = (() => { const _io0 = (input) => "string" === typeof input.id && __typia_transform__isFormatUuid._isFormatUuid(input.id) && "string" === typeof input.email && __typia_transform__isFormatEmail._isFormatEmail(input.email) && "number" === typeof input.age && __typia_transform__isTypeUint32._isTypeUint32(input.age) && 19 < input.age && input.age <= 100; return (input) => "object" === typeof input && null !== input && _io0(input); })()({ id: v4(), email: "samchon.github@gmail.com", age: 30, }); console.log(matched); // true
Programmatic API
Embed ttsc from another Node tool with the TtscCompiler class:
import { TtscCompiler } from "ttsc"; const compiler = new TtscCompiler({ cwd: "./project" }); const result = compiler.compile(); if (result.type === "success") { for (const [path, text] of Object.entries(result.output)) { // path is project-relative ("dist/index.js", "dist/index.d.ts", ...) console.log(path, text.length); } } else if (result.type === "failure") { for (const d of result.diagnostics) { console.error(`${d.file}:${d.line}:${d.character} ${d.messageText}`); } }
See the Programmatic API guide for the full lifecycle, plugin overrides, and patterns. For browser embedding, see @ttsc/wasm and the higher-level @ttsc/playground package.
List of Plugins
ttsc ships a few small utility plugins in this repository.
@ttsc/banner: adds@packageDocumentationJSDoc banners.@ttsc/lint: lints and formats TypeScript source.@ttsc/paths: rewrites source path aliases so JS and declaration emit receive relative imports.@ttsc/strip: removes configured calls anddebuggerstatements.@ttsc/unplugin: runsttscplugins inside bundlers supported byunplugin.
Plugin authors should start from the Guide Documents.
Ecosystem plugins are listed below; PRs adding ttsc plugins are welcome.
nestia: generates NestJS routes, OpenAPI, and SDKs.typia: generates validators, serializers, and type-driven runtime code.
Sponsors
Thanks for your support.
Your donation encourages ttsc development.






















