diff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js
index d77862b1d5396cd99ef9e913016d90bcbade6eac..50d33dde319cb0e246d2af00d8604ac9f0386053 100644
--- a/mode/javascript/javascript.js
+++ b/mode/javascript/javascript.js
@@ -468,6 +468,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
   function maybeTarget(noComma) {
     return function(type) {
       if (type == ".") return cont(noComma ? targetNoComma : target);
+      else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma)
       else return pass(noComma ? expressionNoComma : expression);
     };
   }
@@ -588,6 +589,9 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     if (type == "[") return cont(expect("]"), afterType)
     if (value == "extends") return cont(typeexpr)
   }
+  function maybeTypeArgs(_, value) {
+    if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType)
+  }
   function vardef() {
     return pass(pattern, maybetype, maybeAssign, vardefCont);
   }
diff --git a/mode/javascript/test.js b/mode/javascript/test.js
index 8fd13aee49b471eb7aeff243b82583fb664a125f..2632fd1df5fc56fe4ef0fc3e088d4295a9d67336 100644
--- a/mode/javascript/test.js
+++ b/mode/javascript/test.js
@@ -343,6 +343,9 @@
      "[keyword function] [def x][operator <][type T] [keyword extends] [keyword keyof] [type X][operator >]([def a]: [type T]) {",
      "  [keyword return]")
 
+  TS("typescript_new_typeargs",
+     "[keyword let] [def x] [operator =] [keyword new] [variable Map][operator <][type string], [type Date][operator >]([string-2 `foo${][variable bar][string-2 }`])")
+
   var jsonld_mode = CodeMirror.getMode(
     {indentUnit: 2},
     {name: "javascript", jsonld: true}