From b6ad43d4a5ad193e4dede7a0fed6537e0ac81af9 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Tue, 11 Jul 2017 10:08:42 -0700 Subject: [PATCH] Better error for wrong return (: vs =>) in types It's very ambiguous in expression position, so impossible to give a better message from the parser. For example: let f = (x: number) => number => x + 1; ~~ Should be ':' But the parser doesn't know that 'number' isn't an expression now. --- src/compiler/parser.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index e7f8cb3ef85..74adccae089 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2231,6 +2231,16 @@ namespace ts { else if (parseOptional(returnToken)) { signature.type = parseTypeOrTypePredicate(); } + else if (context === SignatureContext.Type) { + const start = scanner.getTokenPos(); + const length = scanner.getTextPos() - start; + const backwardToken = parseOptional(returnToken === SyntaxKind.ColonToken ? SyntaxKind.EqualsGreaterThanToken : SyntaxKind.ColonToken); + if (backwardToken) { + // This is easy to get backward, especially in type contexts, so parse the type anyway + signature.type = parseTypeOrTypePredicate(); + parseErrorAtPosition(start, length, Diagnostics._0_expected, tokenToString(returnToken)); + } + } } function parseParameterList(context: SignatureContext) {