diff --git a/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.errors.txt b/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.errors.txt
new file mode 100644
index 00000000000..41aadb4d465
--- /dev/null
+++ b/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.errors.txt
@@ -0,0 +1,28 @@
+tests/cases/compiler/incorrectNumberOfTypeArgumentsDuringErrorReporting.ts(18,4): error TS2559: Type 'MyObjA' has no properties in common with type 'ObjA'.
+
+
+==== tests/cases/compiler/incorrectNumberOfTypeArgumentsDuringErrorReporting.ts (1 errors) ====
+ interface ObjA {
+ y?:string,
+ }
+
+ interface ObjB {[key:string]:any}
+
+ interface Opts {a:A, b:B}
+
+ const fn = <
+ A extends ObjA,
+ B extends ObjB = ObjB
+ >(opts:Opts):string => 'Z'
+
+ interface MyObjA {
+ x:string,
+ }
+
+ fn({
+ ~~~~~~
+!!! error TS2559: Type 'MyObjA' has no properties in common with type 'ObjA'.
+ a: {x: 'X', y: 'Y'},
+ b: {},
+ })
+
\ No newline at end of file
diff --git a/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.js b/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.js
new file mode 100644
index 00000000000..d74360e8edc
--- /dev/null
+++ b/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.js
@@ -0,0 +1,30 @@
+//// [incorrectNumberOfTypeArgumentsDuringErrorReporting.ts]
+interface ObjA {
+ y?:string,
+}
+
+interface ObjB {[key:string]:any}
+
+interface Opts {a:A, b:B}
+
+const fn = <
+ A extends ObjA,
+ B extends ObjB = ObjB
+>(opts:Opts):string => 'Z'
+
+interface MyObjA {
+ x:string,
+}
+
+fn({
+ a: {x: 'X', y: 'Y'},
+ b: {},
+})
+
+
+//// [incorrectNumberOfTypeArgumentsDuringErrorReporting.js]
+var fn = function (opts) { return 'Z'; };
+fn({
+ a: { x: 'X', y: 'Y' },
+ b: {}
+});
diff --git a/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.symbols b/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.symbols
new file mode 100644
index 00000000000..5f94ad312c0
--- /dev/null
+++ b/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.symbols
@@ -0,0 +1,60 @@
+=== tests/cases/compiler/incorrectNumberOfTypeArgumentsDuringErrorReporting.ts ===
+interface ObjA {
+>ObjA : Symbol(ObjA, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 0, 0))
+
+ y?:string,
+>y : Symbol(ObjA.y, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 0, 16))
+}
+
+interface ObjB {[key:string]:any}
+>ObjB : Symbol(ObjB, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 2, 1))
+>key : Symbol(key, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 4, 17))
+
+interface Opts {a:A, b:B}
+>Opts : Symbol(Opts, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 4, 33))
+>A : Symbol(A, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 6, 15))
+>B : Symbol(B, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 6, 17))
+>a : Symbol(Opts.a, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 6, 22))
+>A : Symbol(A, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 6, 15))
+>b : Symbol(Opts.b, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 6, 26))
+>B : Symbol(B, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 6, 17))
+
+const fn = <
+>fn : Symbol(fn, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 8, 5))
+
+ A extends ObjA,
+>A : Symbol(A, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 8, 12))
+>ObjA : Symbol(ObjA, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 0, 0))
+
+ B extends ObjB = ObjB
+>B : Symbol(B, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 9, 17))
+>ObjB : Symbol(ObjB, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 2, 1))
+>ObjB : Symbol(ObjB, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 2, 1))
+
+>(opts:Opts):string => 'Z'
+>opts : Symbol(opts, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 11, 2))
+>Opts : Symbol(Opts, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 4, 33))
+>A : Symbol(A, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 8, 12))
+>B : Symbol(B, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 9, 17))
+
+interface MyObjA {
+>MyObjA : Symbol(MyObjA, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 11, 32))
+
+ x:string,
+>x : Symbol(MyObjA.x, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 13, 18))
+}
+
+fn({
+>fn : Symbol(fn, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 8, 5))
+>MyObjA : Symbol(MyObjA, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 11, 32))
+
+ a: {x: 'X', y: 'Y'},
+>a : Symbol(a, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 17, 12))
+>x : Symbol(x, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 18, 6))
+>y : Symbol(y, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 18, 13))
+
+ b: {},
+>b : Symbol(b, Decl(incorrectNumberOfTypeArgumentsDuringErrorReporting.ts, 18, 22))
+
+})
+
diff --git a/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.types b/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.types
new file mode 100644
index 00000000000..681a05eba09
--- /dev/null
+++ b/tests/baselines/reference/incorrectNumberOfTypeArgumentsDuringErrorReporting.types
@@ -0,0 +1,68 @@
+=== tests/cases/compiler/incorrectNumberOfTypeArgumentsDuringErrorReporting.ts ===
+interface ObjA {
+>ObjA : ObjA
+
+ y?:string,
+>y : string
+}
+
+interface ObjB {[key:string]:any}
+>ObjB : ObjB
+>key : string
+
+interface Opts {a:A, b:B}
+>Opts : Opts
+>A : A
+>B : B
+>a : A
+>A : A
+>b : B
+>B : B
+
+const fn = <
+>fn : (opts: Opts) => string
+>< A extends ObjA, B extends ObjB = ObjB>(opts:Opts):string => 'Z' : (opts: Opts) => string
+
+ A extends ObjA,
+>A : A
+>ObjA : ObjA
+
+ B extends ObjB = ObjB
+>B : B
+>ObjB : ObjB
+>ObjB : ObjB
+
+>(opts:Opts):string => 'Z'
+>opts : Opts
+>Opts : Opts
+>A : A
+>B : B
+>'Z' : "Z"
+
+interface MyObjA {
+>MyObjA : MyObjA
+
+ x:string,
+>x : string
+}
+
+fn({
+>fn({ a: {x: 'X', y: 'Y'}, b: {},}) : any
+>fn : (opts: Opts) => string
+>MyObjA : MyObjA
+>{ a: {x: 'X', y: 'Y'}, b: {},} : { a: { x: string; y: string; }; b: {}; }
+
+ a: {x: 'X', y: 'Y'},
+>a : { x: string; y: string; }
+>{x: 'X', y: 'Y'} : { x: string; y: string; }
+>x : string
+>'X' : "X"
+>y : string
+>'Y' : "Y"
+
+ b: {},
+>b : {}
+>{} : {}
+
+})
+
diff --git a/tests/cases/compiler/incorrectNumberOfTypeArgumentsDuringErrorReporting.ts b/tests/cases/compiler/incorrectNumberOfTypeArgumentsDuringErrorReporting.ts
new file mode 100644
index 00000000000..2f6c8c71250
--- /dev/null
+++ b/tests/cases/compiler/incorrectNumberOfTypeArgumentsDuringErrorReporting.ts
@@ -0,0 +1,21 @@
+interface ObjA {
+ y?:string,
+}
+
+interface ObjB {[key:string]:any}
+
+interface Opts {a:A, b:B}
+
+const fn = <
+ A extends ObjA,
+ B extends ObjB = ObjB
+>(opts:Opts):string => 'Z'
+
+interface MyObjA {
+ x:string,
+}
+
+fn({
+ a: {x: 'X', y: 'Y'},
+ b: {},
+})