diff --git a/packages/babel-plugin-transform-typescript/src/index.js b/packages/babel-plugin-transform-typescript/src/index.js index 6fbec8536b1c..b97098d133b4 100644 --- a/packages/babel-plugin-transform-typescript/src/index.js +++ b/packages/babel-plugin-transform-typescript/src/index.js @@ -69,17 +69,26 @@ export default declare( `@babel/plugin-transform-typescript or @babel/preset-typescript is enabled.`, ); } - if (node.definite || node.declare) { + if (node.declare) { if (node.value) { throw path.buildCodeFrameError( - `Definitely assigned fields and fields with the 'declare' modifier cannot` + - ` be initialized here, but only in the constructor`, + `Fields with the 'declare' modifier cannot be initialized here, but only in the constructor`, ); } - if (!node.decorators) { path.remove(); } + } else if (node.definite) { + if (node.value) { + throw path.buildCodeFrameError( + `Definitely assigned fields cannot be initialized here, but only in the constructor`, + ); + } + // keep the definitely assigned fields only when `allowDeclareFields` (equivalent of + // Typescript's `useDefineForClassFields`) is true + if (!allowDeclareFields && !node.decorators) { + path.remove(); + } } else if ( !allowDeclareFields && !node.value && diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-disabled/input.ts b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-disabled/input.ts new file mode 100644 index 000000000000..9716f73fa6a5 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-disabled/input.ts @@ -0,0 +1,3 @@ +class A { + x!; +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-disabled/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-disabled/options.json new file mode 100644 index 000000000000..9373dcbdc3ba --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-disabled/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["transform-typescript", { "allowDeclareFields": false }]] +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-disabled/output.js b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-disabled/output.js new file mode 100644 index 000000000000..a869c2849526 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-disabled/output.js @@ -0,0 +1 @@ +class A {} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-enabled/input.ts b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-enabled/input.ts index 4bb8da7936c6..9716f73fa6a5 100644 --- a/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-enabled/input.ts +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-enabled/input.ts @@ -1,3 +1,3 @@ class A { x!; -} \ No newline at end of file +} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-enabled/output.js b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-enabled/output.js index a869c2849526..eebf5c5c33db 100644 --- a/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-enabled/output.js +++ b/packages/babel-plugin-transform-typescript/test/fixtures/class/uninitialized-definite-with-declare-enabled/output.js @@ -1 +1,3 @@ -class A {} +class A { + x; +}