diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index e43543dd3c7b58a0e4bbe6c7bb17abb79db039f4..0dcd8af3918c510a0a02aad0908b2a9cafbaadba 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -438,7 +438,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
     if (type == "operator") {
       if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me);
-      if (isTS && value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, maybeoperatorNoComma);
+      if (isTS && value == "<" && cx.stream.match(/^([^>]|<.*?>)*>\s*\(/, false))
+        return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me);
       if (value == "?") return cont(expression, expect(":"), expr);
       return cont(expr);
     }
diff --git a/mode/javascript/test.js b/mode/javascript/test.js
index 972a3456510ec1bcef96404b6a7b7743ace8f09a..2437edcca59a7836947dad6e5c9ced3f83c2ade9 100644
--- a/mode/javascript/test.js
+++ b/mode/javascript/test.js
@@ -372,7 +372,8 @@
      "({[property a]: [def p] [operator =>] [variable-2 p]})")
 
   TS("generic in function call",
-     "[keyword this].[property a][operator <][type Type][operator >]([variable foo]);")
+     "[keyword this].[property a][operator <][type Type][operator >]([variable foo]);",
+     "[keyword this].[property a][operator <][variable Type][operator >][variable foo];")
 
   var jsonld_mode = CodeMirror.getMode(
     {indentUnit: 2},