diff --git a/packages/babel-parser/src/plugins/typescript/index.js b/packages/babel-parser/src/plugins/typescript/index.js index d11a8158fb7b..94dad4c21fbf 100644 --- a/packages/babel-parser/src/plugins/typescript/index.js +++ b/packages/babel-parser/src/plugins/typescript/index.js @@ -936,17 +936,16 @@ export default (superClass: Class): Class => operator: TokenType, ): N.TsType { const node: N.TsUnionType | N.TsIntersectionType = this.startNode(); - this.eat(operator); - let type = parseConstituentType(); - if (this.match(operator)) { - const types = [type]; - while (this.eat(operator)) { - types.push(parseConstituentType()); - } - node.types = types; - type = this.finishNode(node, kind); - } - return type; + const hasLeadingOperator = this.eat(operator); + const types = []; + do { + types.push(parseConstituentType()); + } while (this.eat(operator)); + if (types.length === 1 && !hasLeadingOperator) { + return types[0]; + } + node.types = types; + return this.finishNode(node, kind); } tsParseIntersectionTypeOrHigher(): N.TsType { diff --git a/packages/babel-parser/test/fixtures/typescript/types/union-intersection/input.ts b/packages/babel-parser/test/fixtures/typescript/types/union-intersection/input.ts index b565cfe40d50..9eaf7240b1da 100644 --- a/packages/babel-parser/test/fixtures/typescript/types/union-intersection/input.ts +++ b/packages/babel-parser/test/fixtures/typescript/types/union-intersection/input.ts @@ -7,3 +7,5 @@ type J = number | string type F = number & string type K = | number | string type M = & number & string +type N = | number +type O = & string diff --git a/packages/babel-parser/test/fixtures/typescript/types/union-intersection/output.json b/packages/babel-parser/test/fixtures/typescript/types/union-intersection/output.json index cb1cb09da450..3b2d78bb380f 100644 --- a/packages/babel-parser/test/fixtures/typescript/types/union-intersection/output.json +++ b/packages/babel-parser/test/fixtures/typescript/types/union-intersection/output.json @@ -1,9 +1,9 @@ { "type": "File", - "start":0,"end":265,"loc":{"start":{"line":1,"column":0},"end":{"line":9,"column":26}}, + "start":0,"end":301,"loc":{"start":{"line":1,"column":0},"end":{"line":11,"column":17}}, "program": { "type": "Program", - "start":0,"end":265,"loc":{"start":{"line":1,"column":0},"end":{"line":9,"column":26}}, + "start":0,"end":301,"loc":{"start":{"line":1,"column":0},"end":{"line":11,"column":17}}, "sourceType": "module", "interpreter": null, "body": [ @@ -262,6 +262,44 @@ } ] } + }, + { + "type": "TSTypeAliasDeclaration", + "start":266,"end":283,"loc":{"start":{"line":10,"column":0},"end":{"line":10,"column":17}}, + "id": { + "type": "Identifier", + "start":271,"end":272,"loc":{"start":{"line":10,"column":5},"end":{"line":10,"column":6},"identifierName":"N"}, + "name": "N" + }, + "typeAnnotation": { + "type": "TSUnionType", + "start":275,"end":283,"loc":{"start":{"line":10,"column":9},"end":{"line":10,"column":17}}, + "types": [ + { + "type": "TSNumberKeyword", + "start":277,"end":283,"loc":{"start":{"line":10,"column":11},"end":{"line":10,"column":17}} + } + ] + } + }, + { + "type": "TSTypeAliasDeclaration", + "start":284,"end":301,"loc":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}}, + "id": { + "type": "Identifier", + "start":289,"end":290,"loc":{"start":{"line":11,"column":5},"end":{"line":11,"column":6},"identifierName":"O"}, + "name": "O" + }, + "typeAnnotation": { + "type": "TSIntersectionType", + "start":293,"end":301,"loc":{"start":{"line":11,"column":9},"end":{"line":11,"column":17}}, + "types": [ + { + "type": "TSStringKeyword", + "start":295,"end":301,"loc":{"start":{"line":11,"column":11},"end":{"line":11,"column":17}} + } + ] + } } ], "directives": []