diff --git a/packages/babel-types/src/clone/cloneNode.js b/packages/babel-types/src/clone/cloneNode.js index 6e43d191aa66..10a174647d70 100644 --- a/packages/babel-types/src/clone/cloneNode.js +++ b/packages/babel-types/src/clone/cloneNode.js @@ -66,6 +66,9 @@ export default function cloneNode(node: T, deep: boolean = true): T { ...node.extra, }; } + if (has(node, "typeAnnotation")) { + newNode.typeAnnotation = node.typeAnnotation; + } return newNode; } diff --git a/packages/babel-types/test/cloning.js b/packages/babel-types/test/cloning.js index 0ad43fbfd781..0086a30b7623 100644 --- a/packages/babel-types/test/cloning.js +++ b/packages/babel-types/test/cloning.js @@ -56,4 +56,17 @@ describe("cloneNode", function() { expect(node.object).toBe(cloned.object); expect(node.property).toBe(cloned.property); }); + + it("should preserve type annotations", function() { + const node = t.variableDeclaration("let", [ + t.variableDeclarator({ + ...t.identifier("value"), + typeAnnotation: t.anyTypeAnnotation(), + }), + ]); + const cloned = t.cloneNode(node, /* deep */ true); + expect(cloned.declarations[0].id.typeAnnotation).toBe( + node.declarations[0].id.typeAnnotation, + ); + }); });