(x: T) => T>; // shouldn't be a parse error
+>fail1 : any
+>x : T
+
diff --git a/tests/baselines/reference/incompleteObjectLiteral1.errors.txt b/tests/baselines/reference/incompleteObjectLiteral1.errors.txt
index 9122063302e4f..453ba9da5893f 100644
--- a/tests/baselines/reference/incompleteObjectLiteral1.errors.txt
+++ b/tests/baselines/reference/incompleteObjectLiteral1.errors.txt
@@ -1,11 +1,11 @@
-tests/cases/compiler/incompleteObjectLiteral1.ts(1,12): error TS2304: Cannot find name 'aa'.
+tests/cases/compiler/incompleteObjectLiteral1.ts(1,12): error TS18004: No value exists in scope for the shorthand property 'aa'. Either declare one or provide an initializer.
tests/cases/compiler/incompleteObjectLiteral1.ts(1,14): error TS1005: ',' expected.
==== tests/cases/compiler/incompleteObjectLiteral1.ts (2 errors) ====
var tt = { aa; }
~~
-!!! error TS2304: Cannot find name 'aa'.
+!!! error TS18004: No value exists in scope for the shorthand property 'aa'. Either declare one or provide an initializer.
~
!!! error TS1005: ',' expected.
var x = tt;
\ No newline at end of file
diff --git a/tests/baselines/reference/indexerConstraints2.errors.txt b/tests/baselines/reference/indexerConstraints2.errors.txt
index 7e104e77f9865..aca2af28adc12 100644
--- a/tests/baselines/reference/indexerConstraints2.errors.txt
+++ b/tests/baselines/reference/indexerConstraints2.errors.txt
@@ -9,9 +9,10 @@ tests/cases/compiler/indexerConstraints2.ts(58,6): error TS1023: An index signat
tests/cases/compiler/indexerConstraints2.ts(64,6): error TS1023: An index signature parameter type must be 'string' or 'number'.
tests/cases/compiler/indexerConstraints2.ts(70,6): error TS1023: An index signature parameter type must be 'string' or 'number'.
tests/cases/compiler/indexerConstraints2.ts(74,6): error TS1337: An index signature parameter type cannot be a union type. Consider using a mapped object type instead.
+tests/cases/compiler/indexerConstraints2.ts(79,6): error TS1336: An index signature parameter type cannot be a type alias. Consider writing '[key: string]: any' instead.
-==== tests/cases/compiler/indexerConstraints2.ts (11 errors) ====
+==== tests/cases/compiler/indexerConstraints2.ts (12 errors) ====
class A { a: number; }
class B extends A { b: number; }
@@ -108,4 +109,12 @@ tests/cases/compiler/indexerConstraints2.ts(74,6): error TS1337: An index signat
[u: "foo" | "bar"]: A;
~
!!! error TS1337: An index signature parameter type cannot be a union type. Consider using a mapped object type instead.
- }
\ No newline at end of file
+ }
+
+ type Key = string;
+ interface T {
+ [key: Key]
+ ~~~
+!!! error TS1336: An index signature parameter type cannot be a type alias. Consider writing '[key: string]: any' instead.
+ }
+
\ No newline at end of file
diff --git a/tests/baselines/reference/indexerConstraints2.js b/tests/baselines/reference/indexerConstraints2.js
index 95d9425519525..634be50d22b76 100644
--- a/tests/baselines/reference/indexerConstraints2.js
+++ b/tests/baselines/reference/indexerConstraints2.js
@@ -73,7 +73,13 @@ interface R {
interface S {
[u: "foo" | "bar"]: A;
-}
+}
+
+type Key = string;
+interface T {
+ [key: Key]
+}
+
//// [indexerConstraints2.js]
var __extends = (this && this.__extends) || (function () {
diff --git a/tests/baselines/reference/indexerConstraints2.symbols b/tests/baselines/reference/indexerConstraints2.symbols
index 4cb5558a8cea5..b2c90f0c1d29d 100644
--- a/tests/baselines/reference/indexerConstraints2.symbols
+++ b/tests/baselines/reference/indexerConstraints2.symbols
@@ -155,3 +155,15 @@ interface S {
>u : Symbol(u, Decl(indexerConstraints2.ts, 73, 5))
>A : Symbol(A, Decl(indexerConstraints2.ts, 0, 0))
}
+
+type Key = string;
+>Key : Symbol(Key, Decl(indexerConstraints2.ts, 74, 1))
+
+interface T {
+>T : Symbol(T, Decl(indexerConstraints2.ts, 76, 18))
+
+ [key: Key]
+>key : Symbol(key, Decl(indexerConstraints2.ts, 78, 5))
+>Key : Symbol(Key, Decl(indexerConstraints2.ts, 74, 1))
+}
+
diff --git a/tests/baselines/reference/indexerConstraints2.types b/tests/baselines/reference/indexerConstraints2.types
index dabe7bca687dc..1f5423b594878 100644
--- a/tests/baselines/reference/indexerConstraints2.types
+++ b/tests/baselines/reference/indexerConstraints2.types
@@ -118,3 +118,12 @@ interface S {
[u: "foo" | "bar"]: A;
>u : IndexableUnion
}
+
+type Key = string;
+>Key : string
+
+interface T {
+ [key: Key]
+>key : string
+}
+
diff --git a/tests/baselines/reference/inferFromGenericFunctionReturnTypes3.symbols b/tests/baselines/reference/inferFromGenericFunctionReturnTypes3.symbols
index 7281886e627e0..f89421cde07a7 100644
--- a/tests/baselines/reference/inferFromGenericFunctionReturnTypes3.symbols
+++ b/tests/baselines/reference/inferFromGenericFunctionReturnTypes3.symbols
@@ -204,9 +204,9 @@ function objectToMap(obj: any) {
return new Map(Object.keys(obj).map(key => [key, obj[key]]));
>Map : Symbol(Map, Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
>Object.keys(obj).map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --))
->Object.keys : Symbol(ObjectConstructor.keys, Decl(lib.es5.d.ts, --, --))
+>Object.keys : Symbol(ObjectConstructor.keys, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
->keys : Symbol(ObjectConstructor.keys, Decl(lib.es5.d.ts, --, --))
+>keys : Symbol(ObjectConstructor.keys, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --))
>obj : Symbol(obj, Decl(inferFromGenericFunctionReturnTypes3.ts, 83, 21))
>map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --))
>key : Symbol(key, Decl(inferFromGenericFunctionReturnTypes3.ts, 84, 37))
diff --git a/tests/baselines/reference/inferFromGenericFunctionReturnTypes3.types b/tests/baselines/reference/inferFromGenericFunctionReturnTypes3.types
index ccbeb99a11379..fd83694a171a3 100644
--- a/tests/baselines/reference/inferFromGenericFunctionReturnTypes3.types
+++ b/tests/baselines/reference/inferFromGenericFunctionReturnTypes3.types
@@ -231,9 +231,9 @@ function objectToMap(obj: any) {
>Object.keys(obj).map(key => [key, obj[key]]) : [string, any][]
>Object.keys(obj).map : (callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[]
>Object.keys(obj) : string[]
->Object.keys : (o: {}) => string[]
+>Object.keys : { (o: object): string[]; (o: {}): string[]; }
>Object : ObjectConstructor
->keys : (o: {}) => string[]
+>keys : { (o: object): string[]; (o: {}): string[]; }
>obj : any
>map : (callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[]
>key => [key, obj[key]] : (key: string) => [string, any]
diff --git a/tests/baselines/reference/inlineJsxFactoryDeclarationsLocalTypes.errors.txt b/tests/baselines/reference/inlineJsxFactoryDeclarationsLocalTypes.errors.txt
index 09653e2d35992..c4a7c6809bcc5 100644
--- a/tests/baselines/reference/inlineJsxFactoryDeclarationsLocalTypes.errors.txt
+++ b/tests/baselines/reference/inlineJsxFactoryDeclarationsLocalTypes.errors.txt
@@ -1,10 +1,10 @@
-tests/cases/conformance/jsx/inline/index.tsx(5,1): error TS2741: Property '__predomBrand' is missing in type 'Element' but required in type 'Element'.
+tests/cases/conformance/jsx/inline/index.tsx(5,1): error TS2741: Property '__predomBrand' is missing in type 'import("tests/cases/conformance/jsx/inline/renderer").dom.JSX.Element' but required in type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element'.
tests/cases/conformance/jsx/inline/index.tsx(21,40): error TS2322: Type 'import("tests/cases/conformance/jsx/inline/renderer").dom.JSX.Element' is not assignable to type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element'.
tests/cases/conformance/jsx/inline/index.tsx(21,40): error TS2605: JSX element type 'MyClass' is not a constructor function for JSX elements.
Property '__domBrand' is missing in type 'MyClass' but required in type 'ElementClass'.
tests/cases/conformance/jsx/inline/index.tsx(21,63): error TS2322: Type 'import("tests/cases/conformance/jsx/inline/renderer").dom.JSX.Element' is not assignable to type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element'.
tests/cases/conformance/jsx/inline/index.tsx(21,63): error TS2605: JSX element type 'MyClass' is not a constructor function for JSX elements.
-tests/cases/conformance/jsx/inline/index.tsx(24,42): error TS2741: Property '__domBrand' is missing in type 'Element' but required in type 'Element'.
+tests/cases/conformance/jsx/inline/index.tsx(24,42): error TS2741: Property '__domBrand' is missing in type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element' but required in type 'import("tests/cases/conformance/jsx/inline/renderer").dom.JSX.Element'.
tests/cases/conformance/jsx/inline/index.tsx(24,48): error TS2322: Type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element' is not assignable to type 'import("tests/cases/conformance/jsx/inline/renderer").dom.JSX.Element'.
@@ -75,7 +75,7 @@ tests/cases/conformance/jsx/inline/index.tsx(24,48): error TS2322: Type 'import(
let elem = prerendered;
elem = ; // Expect assignability error here
~~~~
-!!! error TS2741: Property '__predomBrand' is missing in type 'Element' but required in type 'Element'.
+!!! error TS2741: Property '__predomBrand' is missing in type 'import("tests/cases/conformance/jsx/inline/renderer").dom.JSX.Element' but required in type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element'.
!!! related TS2728 tests/cases/conformance/jsx/inline/renderer2.d.ts:7:13: '__predomBrand' is declared here.
const DOMSFC = (props: {x: number, y: number, children?: dom.JSX.Element[]}) => {props.x} + {props.y} = {props.x + props.y}{props.children}
;
@@ -107,7 +107,7 @@ tests/cases/conformance/jsx/inline/index.tsx(24,48): error TS2322: Type 'import(
// Should fail, nondom isn't allowed as children of dom
const _brokenTree2 = {tree}{tree}
~~~~~~
-!!! error TS2741: Property '__domBrand' is missing in type 'Element' but required in type 'Element'.
+!!! error TS2741: Property '__domBrand' is missing in type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element' but required in type 'import("tests/cases/conformance/jsx/inline/renderer").dom.JSX.Element'.
!!! related TS2728 tests/cases/conformance/jsx/inline/renderer.d.ts:7:13: '__domBrand' is declared here.
~~~~~~
!!! error TS2322: Type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element' is not assignable to type 'import("tests/cases/conformance/jsx/inline/renderer").dom.JSX.Element'.
diff --git a/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.errors.txt b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.errors.txt
index df487eb72e075..c8490e7e33f7e 100644
--- a/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.errors.txt
+++ b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.errors.txt
@@ -1,4 +1,4 @@
-tests/cases/conformance/jsx/inline/index.tsx(5,1): error TS2741: Property '__predomBrand' is missing in type 'Element' but required in type 'Element'.
+tests/cases/conformance/jsx/inline/index.tsx(5,1): error TS2741: Property '__predomBrand' is missing in type 'JSX.Element' but required in type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element'.
==== tests/cases/conformance/jsx/inline/renderer.d.ts (0 errors) ====
@@ -45,6 +45,6 @@ tests/cases/conformance/jsx/inline/index.tsx(5,1): error TS2741: Property '__pre
let elem = prerendered;
elem = ; // Expect assignability error here
~~~~
-!!! error TS2741: Property '__predomBrand' is missing in type 'Element' but required in type 'Element'.
+!!! error TS2741: Property '__predomBrand' is missing in type 'JSX.Element' but required in type 'import("tests/cases/conformance/jsx/inline/renderer2").predom.JSX.Element'.
!!! related TS2728 tests/cases/conformance/jsx/inline/renderer2.d.ts:7:13: '__predomBrand' is declared here.
\ No newline at end of file
diff --git a/tests/baselines/reference/jsxChildrenIndividualErrorElaborations.errors.txt b/tests/baselines/reference/jsxChildrenIndividualErrorElaborations.errors.txt
index b8f4ed8b2a894..f7750b86b7a65 100644
--- a/tests/baselines/reference/jsxChildrenIndividualErrorElaborations.errors.txt
+++ b/tests/baselines/reference/jsxChildrenIndividualErrorElaborations.errors.txt
@@ -2,6 +2,7 @@ tests/cases/compiler/index.tsx(14,9): error TS2322: Type 'number' is not assigna
tests/cases/compiler/index.tsx(18,15): error TS2747: 'Blah' components don't accept text as child elements. Text in JSX has the type 'string', but the expected type of 'children' is '(x: number) => string'.
tests/cases/compiler/index.tsx(23,10): error TS2746: This JSX tag's 'children' prop expects a single child of type '(x: number) => string', but multiple children were provided.
tests/cases/compiler/index.tsx(37,10): error TS2745: This JSX tag's 'children' prop expects type '((x: number) => string)[]' which requires multiple children, but only a single child was provided.
+tests/cases/compiler/index.tsx(38,4): error TS7006: Parameter 'x' implicitly has an 'any' type.
tests/cases/compiler/index.tsx(42,10): error TS2745: This JSX tag's 'children' prop expects type '((x: number) => string)[]' which requires multiple children, but only a single child was provided.
tests/cases/compiler/index.tsx(48,9): error TS2322: Type 'number' is not assignable to type 'string'.
tests/cases/compiler/index.tsx(49,9): error TS2322: Type 'number' is not assignable to type 'string'.
@@ -13,7 +14,7 @@ tests/cases/compiler/index.tsx(73,9): error TS2322: Type 'number' is not assigna
tests/cases/compiler/index.tsx(74,9): error TS2322: Type 'number' is not assignable to type 'string'.
-==== tests/cases/compiler/index.tsx (11 errors) ====
+==== tests/cases/compiler/index.tsx (12 errors) ====
///
import * as React from "react";
@@ -64,6 +65,8 @@ tests/cases/compiler/index.tsx(74,9): error TS2322: Type 'number' is not assigna
~~~~~
!!! error TS2745: This JSX tag's 'children' prop expects type '((x: number) => string)[]' which requires multiple children, but only a single child was provided.
{x => x}
+ ~
+!!! error TS7006: Parameter 'x' implicitly has an 'any' type.
// Blah2 components don't accept text as child elements
diff --git a/tests/baselines/reference/jsxChildrenIndividualErrorElaborations.types b/tests/baselines/reference/jsxChildrenIndividualErrorElaborations.types
index d466a71ecc32b..267e3a7027e57 100644
--- a/tests/baselines/reference/jsxChildrenIndividualErrorElaborations.types
+++ b/tests/baselines/reference/jsxChildrenIndividualErrorElaborations.types
@@ -85,9 +85,9 @@ var a =
>Blah2 : (props: PropsArr) => JSX.Element
{x => x}
->x => x : (x: number) => number
->x : number
->x : number
+>x => x : (x: any) => any
+>x : any
+>x : any
>Blah2 : (props: PropsArr) => JSX.Element
diff --git a/tests/baselines/reference/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.js b/tests/baselines/reference/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.js
new file mode 100644
index 0000000000000..7ccea1b36aef6
--- /dev/null
+++ b/tests/baselines/reference/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.js
@@ -0,0 +1,61 @@
+//// [jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx]
+///
+
+import * as React from 'react'
+
+type Tab = [string, React.ReactNode] // [tabName, tabContent]
+
+interface Props {
+ children: Tab[]
+}
+
+function TabLayout(props: Props) {
+ return
+}
+
+export class App extends React.Component<{}> {
+ render() {
+ return
+ {[
+ ['Users', ],
+ ['Products', ]
+ ]}
+
+ }
+}
+
+//// [jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.js]
+"use strict";
+///
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+exports.__esModule = true;
+var React = require("react");
+function TabLayout(props) {
+ return React.createElement("div", null);
+}
+var App = /** @class */ (function (_super) {
+ __extends(App, _super);
+ function App() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ App.prototype.render = function () {
+ return React.createElement(TabLayout, null, [
+ ['Users', React.createElement("div", null)],
+ ['Products', React.createElement("div", null)]
+ ]);
+ };
+ return App;
+}(React.Component));
+exports.App = App;
diff --git a/tests/baselines/reference/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.symbols b/tests/baselines/reference/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.symbols
new file mode 100644
index 0000000000000..93737d2a6f8a0
--- /dev/null
+++ b/tests/baselines/reference/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.symbols
@@ -0,0 +1,52 @@
+=== tests/cases/compiler/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx ===
+///
+
+import * as React from 'react'
+>React : Symbol(React, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 2, 6))
+
+type Tab = [string, React.ReactNode] // [tabName, tabContent]
+>Tab : Symbol(Tab, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 2, 30))
+>React : Symbol(React, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 2, 6))
+>ReactNode : Symbol(React.ReactNode, Decl(react16.d.ts, 216, 49))
+
+interface Props {
+>Props : Symbol(Props, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 4, 36))
+
+ children: Tab[]
+>children : Symbol(Props.children, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 6, 17))
+>Tab : Symbol(Tab, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 2, 30))
+}
+
+function TabLayout(props: Props) {
+>TabLayout : Symbol(TabLayout, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 8, 1))
+>props : Symbol(props, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 10, 19))
+>Props : Symbol(Props, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 4, 36))
+
+ return
+>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114))
+}
+
+export class App extends React.Component<{}> {
+>App : Symbol(App, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 12, 1))
+>React.Component : Symbol(React.Component, Decl(react16.d.ts, 345, 54), Decl(react16.d.ts, 349, 94))
+>React : Symbol(React, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 2, 6))
+>Component : Symbol(React.Component, Decl(react16.d.ts, 345, 54), Decl(react16.d.ts, 349, 94))
+
+ render() {
+>render : Symbol(App.render, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 14, 46))
+
+ return
+>TabLayout : Symbol(TabLayout, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 8, 1))
+
+ {[
+ ['Users', ],
+>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114))
+
+ ['Products', ]
+>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2420, 114))
+
+ ]}
+
+>TabLayout : Symbol(TabLayout, Decl(jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx, 8, 1))
+ }
+}
diff --git a/tests/baselines/reference/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.types b/tests/baselines/reference/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.types
new file mode 100644
index 0000000000000..dd302f4067963
--- /dev/null
+++ b/tests/baselines/reference/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.types
@@ -0,0 +1,57 @@
+=== tests/cases/compiler/jsxChildrenSingleChildConfusableWithMultipleChildrenNoError.tsx ===
+///
+
+import * as React from 'react'
+>React : typeof React
+
+type Tab = [string, React.ReactNode] // [tabName, tabContent]
+>Tab : [string, React.ReactNode]
+>React : any
+
+interface Props {
+ children: Tab[]
+>children : [string, React.ReactNode][]
+}
+
+function TabLayout(props: Props) {
+>TabLayout : (props: Props) => JSX.Element
+>props : Props
+
+ return
+> : JSX.Element
+>div : any
+}
+
+export class App extends React.Component<{}> {
+>App : App
+>React.Component : React.Component<{}, {}, any>
+>React : typeof React
+>Component : typeof React.Component
+
+ render() {
+>render : () => JSX.Element
+
+ return
+> {[ ['Users', ], ['Products', ] ]} : JSX.Element
+>TabLayout : (props: Props) => JSX.Element
+
+ {[
+>[ ['Users', ], ['Products', ] ] : [string, JSX.Element][]
+
+ ['Users', ],
+>['Users', ] : [string, JSX.Element]
+>'Users' : "Users"
+> : JSX.Element
+>div : any
+
+ ['Products', ]
+>['Products', ] : [string, JSX.Element]
+>'Products' : "Products"
+> : JSX.Element
+>div : any
+
+ ]}
+
+>TabLayout : (props: Props) => JSX.Element
+ }
+}
diff --git a/tests/baselines/reference/literalTypeWidening.types b/tests/baselines/reference/literalTypeWidening.types
index a96ddc8c5da3e..95bde9a08ac3d 100644
--- a/tests/baselines/reference/literalTypeWidening.types
+++ b/tests/baselines/reference/literalTypeWidening.types
@@ -391,9 +391,9 @@ export function keys(obj: Record): K[] {
return Object.keys(obj) as K[]
>Object.keys(obj) as K[] : K[]
>Object.keys(obj) : string[]
->Object.keys : (o: {}) => string[]
+>Object.keys : (o: object) => string[]
>Object : ObjectConstructor
->keys : (o: {}) => string[]
+>keys : (o: object) => string[]
>obj : Record
}
diff --git a/tests/baselines/reference/nearbyIdenticalGenericLambdasAssignable.js b/tests/baselines/reference/nearbyIdenticalGenericLambdasAssignable.js
new file mode 100644
index 0000000000000..34413e8f72ba5
--- /dev/null
+++ b/tests/baselines/reference/nearbyIdenticalGenericLambdasAssignable.js
@@ -0,0 +1,54 @@
+//// [nearbyIdenticalGenericLambdasAssignable.ts]
+declare const fA: () => { v: T };
+const fB = () => {
+ return { v: '' as any as T };
+};
+const fC = () => {
+ return {} as any as { v: T };
+};
+
+// Hover display is identical on all of these
+type TA = typeof fA;
+type TB = typeof fB;
+type TC = typeof fC;
+type TL = () => { v: T };
+
+declare function accA(x: TA): void;
+declare function accB(x: TB): void;
+declare function accC(x: TC): void;
+declare function accL(x: TL): void;
+
+// These should all be OK, every type is identical
+accA(fA); accA(fB); accA(fC);
+// ~~ previously an error
+accB(fA); accB(fB); accB(fC);
+// OK
+accC(fA); accC(fB); accC(fC);
+// ~~ previously an error
+accL(fA); accL(fB); accL(fC);
+// ~~ previously an error
+
+//// [nearbyIdenticalGenericLambdasAssignable.js]
+var fB = function () {
+ return { v: '' };
+};
+var fC = function () {
+ return {};
+};
+// These should all be OK, every type is identical
+accA(fA);
+accA(fB);
+accA(fC);
+// ~~ previously an error
+accB(fA);
+accB(fB);
+accB(fC);
+// OK
+accC(fA);
+accC(fB);
+accC(fC);
+// ~~ previously an error
+accL(fA);
+accL(fB);
+accL(fC);
+// ~~ previously an error
diff --git a/tests/baselines/reference/nearbyIdenticalGenericLambdasAssignable.symbols b/tests/baselines/reference/nearbyIdenticalGenericLambdasAssignable.symbols
new file mode 100644
index 0000000000000..b9236cc887daf
--- /dev/null
+++ b/tests/baselines/reference/nearbyIdenticalGenericLambdasAssignable.symbols
@@ -0,0 +1,102 @@
+=== tests/cases/compiler/nearbyIdenticalGenericLambdasAssignable.ts ===
+declare const fA: () => { v: T };
+>fA : Symbol(fA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 0, 13))
+>T : Symbol(T, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 0, 19))
+>v : Symbol(v, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 0, 28))
+>T : Symbol(T, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 0, 19))
+
+const fB = () => {
+>fB : Symbol(fB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 1, 5))
+>T : Symbol(T, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 1, 12))
+
+ return { v: '' as any as T };
+>v : Symbol(v, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 2, 12))
+>T : Symbol(T, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 1, 12))
+
+};
+const fC = () => {
+>fC : Symbol(fC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 4, 5))
+>T : Symbol(T, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 4, 12))
+
+ return {} as any as { v: T };
+>v : Symbol(v, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 5, 25))
+>T : Symbol(T, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 4, 12))
+
+};
+
+// Hover display is identical on all of these
+type TA = typeof fA;
+>TA : Symbol(TA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 6, 2))
+>fA : Symbol(fA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 0, 13))
+
+type TB = typeof fB;
+>TB : Symbol(TB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 9, 20))
+>fB : Symbol(fB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 1, 5))
+
+type TC = typeof fC;
+>TC : Symbol(TC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 10, 20))
+>fC : Symbol(fC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 4, 5))
+
+type TL = () => { v: T };
+>TL : Symbol(TL, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 11, 20))
+>T : Symbol(T, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 12, 11))
+>v : Symbol(v, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 12, 20))
+>T : Symbol(T, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 12, 11))
+
+declare function accA(x: TA): void;
+>accA : Symbol(accA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 12, 28))
+>x : Symbol(x, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 14, 22))
+>TA : Symbol(TA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 6, 2))
+
+declare function accB(x: TB): void;
+>accB : Symbol(accB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 14, 35))
+>x : Symbol(x, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 15, 22))
+>TB : Symbol(TB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 9, 20))
+
+declare function accC(x: TC): void;
+>accC : Symbol(accC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 15, 35))
+>x : Symbol(x, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 16, 22))
+>TC : Symbol(TC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 10, 20))
+
+declare function accL(x: TL): void;
+>accL : Symbol(accL, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 16, 35))
+>x : Symbol(x, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 17, 22))
+>TL : Symbol(TL, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 11, 20))
+
+// These should all be OK, every type is identical
+accA(fA); accA(fB); accA(fC);
+>accA : Symbol(accA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 12, 28))
+>fA : Symbol(fA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 0, 13))
+>accA : Symbol(accA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 12, 28))
+>fB : Symbol(fB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 1, 5))
+>accA : Symbol(accA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 12, 28))
+>fC : Symbol(fC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 4, 5))
+
+// ~~ previously an error
+accB(fA); accB(fB); accB(fC);
+>accB : Symbol(accB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 14, 35))
+>fA : Symbol(fA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 0, 13))
+>accB : Symbol(accB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 14, 35))
+>fB : Symbol(fB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 1, 5))
+>accB : Symbol(accB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 14, 35))
+>fC : Symbol(fC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 4, 5))
+
+// OK
+accC(fA); accC(fB); accC(fC);
+>accC : Symbol(accC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 15, 35))
+>fA : Symbol(fA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 0, 13))
+>accC : Symbol(accC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 15, 35))
+>fB : Symbol(fB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 1, 5))
+>accC : Symbol(accC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 15, 35))
+>fC : Symbol(fC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 4, 5))
+
+// ~~ previously an error
+accL(fA); accL(fB); accL(fC);
+>accL : Symbol(accL, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 16, 35))
+>fA : Symbol(fA, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 0, 13))
+>accL : Symbol(accL, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 16, 35))
+>fB : Symbol(fB, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 1, 5))
+>accL : Symbol(accL, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 16, 35))
+>fC : Symbol(fC, Decl(nearbyIdenticalGenericLambdasAssignable.ts, 4, 5))
+
+// ~~ previously an error
diff --git a/tests/baselines/reference/nearbyIdenticalGenericLambdasAssignable.types b/tests/baselines/reference/nearbyIdenticalGenericLambdasAssignable.types
new file mode 100644
index 0000000000000..b2f878d548ab5
--- /dev/null
+++ b/tests/baselines/reference/nearbyIdenticalGenericLambdasAssignable.types
@@ -0,0 +1,111 @@
+=== tests/cases/compiler/nearbyIdenticalGenericLambdasAssignable.ts ===
+declare const fA: () => { v: T };
+>fA : () => { v: T; }
+>v : T
+
+const fB = () => {
+>fB : () => { v: T; }
+>() => { return { v: '' as any as T };} : () => { v: T; }
+
+ return { v: '' as any as T };
+>{ v: '' as any as T } : { v: T; }
+>v : T
+>'' as any as T : T
+>'' as any : any
+>'' : ""
+
+};
+const fC = () => {
+>fC : () => { v: T; }
+>() => { return {} as any as { v: T };} : () => { v: T; }
+
+ return {} as any as { v: T };
+>{} as any as { v: T } : { v: T; }
+>{} as any : any
+>{} : {}
+>v : T
+
+};
+
+// Hover display is identical on all of these
+type TA = typeof fA;
+>TA : () => { v: T; }
+>fA : () => { v: T; }
+
+type TB = typeof fB;
+>TB : () => { v: T; }
+>fB : () => { v: T; }
+
+type TC = typeof fC;
+>TC : () => { v: T; }
+>fC : () => { v: T; }
+
+type TL = () => { v: T };
+>TL : TL
+>v : T
+
+declare function accA(x: TA): void;
+>accA : (x: () => { v: T; }) => void
+>x : () => { v: T; }
+
+declare function accB(x: TB): void;
+>accB : (x: