Skip to main content


This preset is recommended if you use TypeScript, a typed superset of JavaScript. It includes the following plugins:

You will need to specify --extensions ".ts" for @babel/cli & @babel/node cli's to handle .ts files.



const x: number = 0;


const x = 0;


npm install --save-dev @babel/preset-typescript


"presets": ["@babel/preset-typescript"]


babel --presets @babel/preset-typescript script.ts

Via Node API

require("@babel/core").transformSync("code", {
presets: ["@babel/preset-typescript"],
filename: 'script.ts',



boolean, defaults to false

Forcibly enables jsx parsing. Otherwise angle brackets will be treated as typescript's legacy type assertion var foo = <string>bar;. Also, isTSX: true requires allExtensions: true.


string, defaults to React

Replace the function used when compiling JSX expressions. This is so that we know that the import is not a type import, and should not be removed.


string, defaults to React.Fragment

Replace the function used when compiling JSX fragment expressions. This is so that we know that the import is not a type import, and should not be removed.


boolean, defaults to false

Indicates that every file should be parsed as TS, TSX, or as TS without JSX ambiguities (depending on the isTSX and disallowAmbiguousJSXLike options).


boolean, uses the default set by @babel/plugin-transform-typescript.

Added in: v7.6.0

Enables compilation of TypeScript namespaces.


boolean, defaults to false

Added in: v7.7.0

NOTE: This will be enabled by default in Babel 8

When enabled, type-only class fields are only removed if they are prefixed with the declare modifier:

class A {
declare foo: string; // Removed
bar: string; // Initialized to undefined
prop?: string; // Initialized to undefined
prop1!: string // Initialized to undefined


boolean, defaults to true for .mts and .cts files and to false otherwise.

Added in: v7.16.0

Even when JSX parsing is not enabled, this option disallows using syntax that would be ambiguous with JSX (<X> y type assertions and <X>() => {} type arguments). It matches the tsc behavior when parsing .mts and .mjs files.


boolean, defaults to false

Added in: v7.21.4

When it is set to false, Babel will automatically provide required plugins for *.ts, *.tsx, *.mts and *.cts files.

When it is set to true, Babel will provide a general TS plugin. If you want to transpile source as if it were *.tsx, enable the @babel/preset-react preset and this plugin should work with the JSX transform seamlessly. For example,

"presets": ["@babel/preset-react"],
"overrides": [{
"test": "*.vue",
"presets": [
["@babel/preset-typescript"], { "ignoreExtensions": true }


boolean, defaults to false

Added in: v7.9.0

When set to true, the transform will only remove type-only imports (introduced in TypeScript 3.8). This should only be used if you are using TypeScript >= 3.8.


boolean, defaults to false

Added in: v7.15.0

When set to true, Babel will inline enum values rather than using the usual enum output:

// Input
const enum Animals {

// Default output
var Animals;

(function (Animals) {
Animals[Animals["Fish"] = 0] = "Fish";
})(Animals || (Animals = {}));


// `optimizeConstEnums` output

This option differs from TypeScript's --isolatedModules behavior, which ignores the const modifier and compiles them as normal enums, and aligns Babel's behavior with TypeScript's default behavior.

However, when exporting a const enum Babel will compile it to a plain object literal so that it doesn't need to rely on cross-file analysis when compiling it:

// Input
export const enum Animals {

// `optimizeConstEnums` output
export var Animals = {
Fish: 0,

You can read more about configuring preset options here.


boolean, defaults to false

Added in: v7.23.0

When set to true, Babel will rewrite .ts/.mts/.cts extensions in import declarations to .js/.mjs/.cjs.

This option, when used together with TypeScript's allowImportingTsExtension option, allows to write complete relative specifiers in import declaratoinss while using the same extension used by the source files.

As an example, given this project structure (where src contains the source files, and dist the compiled files):

├── src
│ ├── main.ts
│ └── dep.ts
├── dist
│ ├── main.js
│ └── dep.js
├── babel.config.json
└── tsconfig.json

and with the following configuration files:

"presets": [
["@babel/preset-typescript", {
"rewriteImportExtensions": true
"compilerOptions": {
"lib": ["esnext"],
"noEmit": true,
"isolatedModules": true,
"moduleResolution": "nodenext",
"allowImportingTsExtensions": true

you will be able to write import x from "./dep.ts" in main.ts, and Babel will transform it to import x from "./dep.js" when compiling main.ts to main.js.