# Super.js > A strict, type-safe superset of JavaScript that follows the ECMAScript standard. Sound types, null safety, sum types, no any — compiles to clean JS today, with native and WASM backends on the roadmap. Super.js is a superset of JavaScript (not TypeScript) focused on type *safety*: nullable types are spelled `T?` and a plain `T` can never be null; sum types with exhaustive `match` make impossible states unrepresentable; `any` is banned and the only escape hatch is the explicit `dynamic`. It compiles to plain JavaScript with zero runtime overhead. ## Start here - [Home](https://superjs.org/) - [Interactive tour](https://superjs.org/tour): five runnable, in-browser lessons - [Playground](https://superjs.org/playground): compile and run Super.js in the browser - [Error code reference](https://superjs.org/errors): every SJS-P/E/W/L diagnostic ## Documentation - [Introduction](https://superjs.org/docs/intro) - [Language Reference](https://superjs.org/docs/language-reference) - [Examples](https://superjs.org/docs/examples) - [Type System](https://superjs.org/docs/type-system) - [JavaScript & TypeScript Interop](https://superjs.org/docs/interop) - [Tooling](https://superjs.org/docs/tooling) - [CLI Reference](https://superjs.org/docs/cli) - [Editor Setup](https://superjs.org/docs/editors) - [Changelog](https://superjs.org/docs/changelog) - [Roadmap](https://superjs.org/docs/roadmap) - [Specification](https://superjs.org/docs/specification) - [FAQ](https://superjs.org/docs/faq) - [v1.0 RC Status](https://superjs.org/docs/roadmap/v1.0-rc-status) - [Playground Worker Deploy](https://superjs.org/docs/ops/playground-deploy) - [Maintenance & On-Call](https://superjs.org/docs/ops/maintenance) - [VS Code Marketplace](https://superjs.org/docs/ops/vscode-marketplace) - [RC maintainer gates](https://superjs.org/docs/ops/rc-maintainer-gates) - [Launch drafts](https://superjs.org/docs/launch/index) - [Language Tour](https://superjs.org/docs/tour/index) - [01 — Hello world](https://superjs.org/docs/tour/01-hello-world) - [02 — Variables and types](https://superjs.org/docs/tour/02-variables-and-types) - [03 — Functions](https://superjs.org/docs/tour/03-functions) - [04 — Control flow](https://superjs.org/docs/tour/04-control-flow) - [05 — Null safety](https://superjs.org/docs/tour/05-null-safety) - [06 — Pattern matching](https://superjs.org/docs/tour/06-pattern-matching) - [07 — Sum types](https://superjs.org/docs/tour/07-sum-types) - [08 — Object types](https://superjs.org/docs/tour/08-interfaces) - [09 — Generics](https://superjs.org/docs/tour/09-generics) - [10 — Classes](https://superjs.org/docs/tour/10-classes) - [11 — Modules](https://superjs.org/docs/tour/11-modules) - [12 — Async and await](https://superjs.org/docs/tour/12-async-await) - [13 — JSX](https://superjs.org/docs/tour/13-jsx) - [14 — Calling JS from SJS](https://superjs.org/docs/tour/14-calling-js-from-sjs) - [15 — dynamic and Schema](https://superjs.org/docs/tour/15-dynamic-and-schema) - [16 — Errors and Result](https://superjs.org/docs/tour/16-errors-and-result) - [17 — Iterators and for...of](https://superjs.org/docs/tour/17-iterators-and-for-of) - [18 — Serverless handlers](https://superjs.org/docs/tour/18-serverless-handlers) - [19 — Tooling tour](https://superjs.org/docs/tour/19-tooling-tour) - [20 — Migrating a TS file](https://superjs.org/docs/tour/20-migrating-a-ts-file) - [README](https://superjs.org/docs/press/README) - [sjs-vs-typescript-one-pager](https://superjs.org/docs/press/sjs-vs-typescript-one-pager) - [Migration Guide](https://superjs.org/docs/migration/index) - [Syntax Rewrites](https://superjs.org/docs/migration/01-syntax) - [Idiom Changes](https://superjs.org/docs/migration/02-idioms) - [Library Ecosystem](https://superjs.org/docs/migration/03-library) - [API Reference](https://superjs.org/docs/api/index) - [std-async](https://superjs.org/docs/api/std-async) - [std-collections](https://superjs.org/docs/api/std-collections) - [std-core](https://superjs.org/docs/api/std-core) - [std-fs](https://superjs.org/docs/api/std-fs) - [std-json](https://superjs.org/docs/api/std-json) - [std-math](https://superjs.org/docs/api/std-math) - [std-path](https://superjs.org/docs/api/std-path) - [std-process](https://superjs.org/docs/api/std-process) - [std-schema](https://superjs.org/docs/api/std-schema) - [std-string](https://superjs.org/docs/api/std-string) - [std-time](https://superjs.org/docs/api/std-time) - [Why SuperJS](https://superjs.org/docs/why/index) - [Compatibility Matrix](https://superjs.org/docs/compat/index) - [Performance Benchmarks](https://superjs.org/docs/perf/index) - [LSP Memory Audit](https://superjs.org/docs/perf/lsp-memory-audit) - [Error Codes](https://superjs.org/docs/error-codes/index) - [SJS-E001 — Null or undefined assigned to non-nullable type](https://superjs.org/docs/error-codes/SJS-E001) - [SJS-E002 — Type mismatch](https://superjs.org/docs/error-codes/SJS-E002) - [SJS-E003 — Property access on possibly-null value](https://superjs.org/docs/error-codes/SJS-E003) - [SJS-E004 — `any` is not a valid type in SJS](https://superjs.org/docs/error-codes/SJS-E004) - [SJS-E005 — Intersection type `A & B` is not allowed](https://superjs.org/docs/error-codes/SJS-E005) - [SJS-E006 — Mapped type is not allowed in SJS](https://superjs.org/docs/error-codes/SJS-E006) - [SJS-E007 — Non-exhaustive match expression](https://superjs.org/docs/error-codes/SJS-E007) - [SJS-E008 — Conditional type is not allowed in SJS](https://superjs.org/docs/error-codes/SJS-E008) - [SJS-E009 — `infer` keyword is not allowed in SJS](https://superjs.org/docs/error-codes/SJS-E009) - [SJS-E010 — TypeScript `enum` is not allowed in SJS](https://superjs.org/docs/error-codes/SJS-E010) - [SJS-E011 — Non-null assertion `!` is not allowed](https://superjs.org/docs/error-codes/SJS-E011) - [SJS-E012 — `namespace` is not allowed in SJS](https://superjs.org/docs/error-codes/SJS-E012) - [SJS-E013 — `with` statement not allowed (SJS is always strict mode)](https://superjs.org/docs/error-codes/SJS-E013) - [SJS-E014 — Private or protected member not accessible from this scope](https://superjs.org/docs/error-codes/SJS-E014) - [SJS-E015 — Cannot narrow an access modifier on an overriding method or property](https://superjs.org/docs/error-codes/SJS-E015) - [SJS-E016 — Cannot instantiate an abstract class directly with `new`](https://superjs.org/docs/error-codes/SJS-E016) - [SJS-E017 — Circular import detected — module graph contains a cycle](https://superjs.org/docs/error-codes/SJS-E017) - [SJS-E018 — Top-level `await` used outside an ES module context](https://superjs.org/docs/error-codes/SJS-E018) - [SJS-E019 — Unknown JSX element type — identifier not in scope or not a valid component](https://superjs.org/docs/error-codes/SJS-E019) - [SJS-E020 — Ambiguous variant constructor](https://superjs.org/docs/error-codes/SJS-E020) - [SJS-L001 — Prefer `const` — `let` binding is never reassigned](https://superjs.org/docs/error-codes/SJS-L001) - [SJS-L002 — Prefer `let` or `const` over `var`](https://superjs.org/docs/error-codes/SJS-L002) - [SJS-L003 — Use `===` / `!==` — `==` / `!=` performs type coercion](https://superjs.org/docs/error-codes/SJS-L003) - [SJS-L004 — Prefer `for…of` over `for…in` for array and iterable iteration](https://superjs.org/docs/error-codes/SJS-L004) - [SJS-L005 — `debugger` statement found in committed code](https://superjs.org/docs/error-codes/SJS-L005) - [SJS-L006 — `match` expression has no arms](https://superjs.org/docs/error-codes/SJS-L006) - [SJS-L007 — Redundant match arm](https://superjs.org/docs/error-codes/SJS-L007) - [SJS-L008 — Prefer an arrow function callback](https://superjs.org/docs/error-codes/SJS-L008) - [SJS-L009 — Unused import](https://superjs.org/docs/error-codes/SJS-L009) - [SJS-L010 — Import out of order](https://superjs.org/docs/error-codes/SJS-L010) - [SJS-L011 — BiDi control character rejected](https://superjs.org/docs/error-codes/SJS-L011) - [SJS-L012 — Unused top-level declaration](https://superjs.org/docs/error-codes/SJS-L012) - [SJS-L013 — Explicit `dynamic` type annotation](https://superjs.org/docs/error-codes/SJS-L013) - [SJS-L014 — Variable shadowing](https://superjs.org/docs/error-codes/SJS-L014) - [SJS-L015 — Floating promise](https://superjs.org/docs/error-codes/SJS-L015) - [SJS-L016 — Unhandled `Result`](https://superjs.org/docs/error-codes/SJS-L016) - [SJS-L017 — Prefer `Result` over `throw`](https://superjs.org/docs/error-codes/SJS-L017) - [SJS-L018 — Mixed spaces and tabs in indentation](https://superjs.org/docs/error-codes/SJS-L018) - [SJS-P001 — Unexpected token](https://superjs.org/docs/error-codes/SJS-P001) - [SJS-P002 — Unexpected end of file](https://superjs.org/docs/error-codes/SJS-P002) - [SJS-P003 — Invalid syntax in type annotation](https://superjs.org/docs/error-codes/SJS-P003) - [SJS-P004 — Invalid sum type declaration](https://superjs.org/docs/error-codes/SJS-P004) - [SJS-P005 — Invalid match expression](https://superjs.org/docs/error-codes/SJS-P005) - [SJS-P099 — Too many parse errors; recovery abandoned](https://superjs.org/docs/error-codes/SJS-P099) - [SJS-W001 — Implicit `dynamic` — unannotated position in `--strict` mode](https://superjs.org/docs/error-codes/SJS-W001) - [SJS-W002 — `dynamic` value assigned to a typed position without a narrowing check](https://superjs.org/docs/error-codes/SJS-W002) - [SJS-W003 — Unreachable `match` arm — earlier arm already covers this variant](https://superjs.org/docs/error-codes/SJS-W003) - [SJS-W004 — Reserved or future SJS keyword used as an identifier](https://superjs.org/docs/error-codes/SJS-W004) - [SJS-W005 — Explicit `public` modifier is redundant — class members are public by default](https://superjs.org/docs/error-codes/SJS-W005) - [SJS-W006 — Excess property on a fresh object literal assigned to a typed position](https://superjs.org/docs/error-codes/SJS-W006) - [SJS-W007 — Missing `key` prop on JSX element in a list or iterator context](https://superjs.org/docs/error-codes/SJS-W007) - [SJS-W008 — Implicit switch fallthrough between non-empty case clauses](https://superjs.org/docs/error-codes/SJS-W008) - [SJS-W009 — Unreachable code following a terminator statement](https://superjs.org/docs/error-codes/SJS-W009) - [SJS-W010 — `catch` binding not typed as `Error` or `unknown` — untyped catch may hide bugs](https://superjs.org/docs/error-codes/SJS-W010) - [SJS-W012 — BiDi control character in source file](https://superjs.org/docs/error-codes/SJS-W012) - [Language Specification](https://superjs.org/docs/spec/index) - [Standard Library](https://superjs.org/docs/stdlib/index) - [Beta Program](https://superjs.org/docs/beta/index) - [Dynamic Usage Survey (C5)](https://superjs.org/docs/beta/dynamic-usage-survey) - [Bug Bash](https://superjs.org/docs/beta/bug-bash) ## Machine-readable - [llms-full.txt](https://superjs.org/llms-full.txt): all documentation inlined as plain text - [Blog RSS](https://superjs.org/feed.xml) - [Sitemap](https://superjs.org/sitemap.xml) ## Blog - [Preparing for SuperJS v1.0 RC](https://superjs.org/blog/2026-06-24-preparing-for-v1-rc) - [What's coming in Super.js 0.2.0](https://superjs.org/blog/2024-01-15-0-2-0-released) - [Welcome to Super.js](https://superjs.org/blog/2024-01-01-welcome)