diff --git a/packages/babel-parser/src/plugins/typescript/index.js b/packages/babel-parser/src/plugins/typescript/index.js index eebfce60b6..737b174e73 100644 --- a/packages/babel-parser/src/plugins/typescript/index.js +++ b/packages/babel-parser/src/plugins/typescript/index.js @@ -2789,6 +2789,18 @@ export default (superClass: Class): Class => return super.parseMaybeDecoratorArguments(expr); } + checkCommaAfterRest(close) { + if ( + this.state.isDeclareContext && + this.match(tt.comma) && + this.lookaheadCharCode() === close + ) { + this.next(); + } else { + super.checkCommaAfterRest(close); + } + } + // === === === === === === === === === === === === === === === === // Note: All below methods are duplicates of something in flow.js. // Not sure what the best way to combine these is. diff --git a/packages/babel-parser/test/fixtures/typescript/declare/function-rest-trailing-comma/input.ts b/packages/babel-parser/test/fixtures/typescript/declare/function-rest-trailing-comma/input.ts new file mode 100644 index 0000000000..229b58e831 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/declare/function-rest-trailing-comma/input.ts @@ -0,0 +1 @@ +declare function foo(...args: any[], ) diff --git a/packages/babel-parser/test/fixtures/typescript/declare/function-rest-trailing-comma/output.json b/packages/babel-parser/test/fixtures/typescript/declare/function-rest-trailing-comma/output.json new file mode 100644 index 0000000000..05827710a6 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/declare/function-rest-trailing-comma/output.json @@ -0,0 +1,48 @@ +{ + "type": "File", + "start":0,"end":38,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":38}}, + "program": { + "type": "Program", + "start":0,"end":38,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":38}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "TSDeclareFunction", + "start":0,"end":38,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":38}}, + "declare": true, + "id": { + "type": "Identifier", + "start":17,"end":20,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":20},"identifierName":"foo"}, + "name": "foo" + }, + "generator": false, + "async": false, + "params": [ + { + "type": "RestElement", + "start":21,"end":35,"loc":{"start":{"line":1,"column":21},"end":{"line":1,"column":35}}, + "argument": { + "type": "Identifier", + "start":24,"end":28,"loc":{"start":{"line":1,"column":24},"end":{"line":1,"column":28},"identifierName":"args"}, + "name": "args" + }, + "typeAnnotation": { + "type": "TSTypeAnnotation", + "start":28,"end":35,"loc":{"start":{"line":1,"column":28},"end":{"line":1,"column":35}}, + "typeAnnotation": { + "type": "TSArrayType", + "start":30,"end":35,"loc":{"start":{"line":1,"column":30},"end":{"line":1,"column":35}}, + "elementType": { + "type": "TSAnyKeyword", + "start":30,"end":33,"loc":{"start":{"line":1,"column":30},"end":{"line":1,"column":33}} + } + } + } + } + ] + } + ], + "directives": [] + } +} \ No newline at end of file