TSConfig
erasableSyntaxOnly
Node.js supports running TypeScript files directly as of v23.6; however, only TypeScript-specific syntax that does not have runtime semantics are supported under this mode. In other words, it must be possible to easily erase any TypeScript-specific syntax from a file, leaving behind a valid JavaScript file.
That means the following constructs are not supported:
enum
declarationsnamespace
s andmodule
s with runtime code- parameter properties in classes
- Non-ECMAScript
import =
andexport =
assignments
ts
// ❌ error: An `import ... = require(...)` aliasimport foo = require("foo");// ❌ error: A namespace with runtime code.namespace container {foo.method();export type Bar = string;}// ❌ error: An `import =` aliasimport Bar = container.Bar;class Point {// ❌ error: Parameter propertiesconstructor(public x: number, public y: number) { }}// ❌ error: An `export =` assignment.export = Point;// ❌ error: An enum declaration.enum Direction {Up,Down,Left,Right,}
Similar tools like ts-blank-space or Amaro (the underlying library for type-stripping in Node.js) have the same limitations. These tools will provide helpful error messages if they encounter code that doesn’t meet these requirements, but you still won’t find out your code doesn’t work until you actually try to run it.
The --erasableSyntaxOnly
flag will cause TypeScript to error on most TypeScript-specific constructs that have runtime behavior.
ts
class C {constructor(public x: number) { }// ~~~~~~~~~~~~~~~~// error! This syntax is not allowed when 'erasableSyntaxOnly' is enabled.}}
Typically, you will want to combine this flag with the --verbatimModuleSyntax
, which ensures that a module contains the appropriate import syntax, and that import elision does not take place.