diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index 7e144dd26f397..7172eaede2f58 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -27877,6 +27877,7 @@ namespace ts {
}
}
else {
+ error(attributeDecl.expression, Diagnostics.Spread_types_may_only_be_created_from_object_types);
typeToIntersect = typeToIntersect ? getIntersectionType([typeToIntersect, exprType]) : exprType;
}
}
diff --git a/tests/baselines/reference/correctlyMarkAliasAsReferences3.errors.txt b/tests/baselines/reference/correctlyMarkAliasAsReferences3.errors.txt
new file mode 100644
index 0000000000000..080d37c28cb37
--- /dev/null
+++ b/tests/baselines/reference/correctlyMarkAliasAsReferences3.errors.txt
@@ -0,0 +1,18 @@
+tests/cases/conformance/jsx/0.tsx(6,21): error TS2698: Spread types may only be created from object types.
+
+
+==== tests/cases/conformance/jsx/0.tsx (1 errors) ====
+ ///
+ import * as cx from 'classnames';
+ import * as React from "react";
+
+ let buttonProps;
+ let k = ;
+
+==== tests/cases/conformance/jsx/declaration.d.ts (0 errors) ====
+ declare module "classnames";
+
\ No newline at end of file
diff --git a/tests/baselines/reference/jsxExcessPropsAndAssignability.errors.txt b/tests/baselines/reference/jsxExcessPropsAndAssignability.errors.txt
index d2acf8482425f..3e15a705edf6c 100644
--- a/tests/baselines/reference/jsxExcessPropsAndAssignability.errors.txt
+++ b/tests/baselines/reference/jsxExcessPropsAndAssignability.errors.txt
@@ -1,8 +1,10 @@
+tests/cases/compiler/jsxExcessPropsAndAssignability.tsx(14,27): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/jsxExcessPropsAndAssignability.tsx(16,6): error TS2322: Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes> & Readonly<{ children?: ReactNode; }> & Readonly'.
Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'Readonly'.
+tests/cases/compiler/jsxExcessPropsAndAssignability.tsx(16,27): error TS2698: Spread types may only be created from object types.
-==== tests/cases/compiler/jsxExcessPropsAndAssignability.tsx (1 errors) ====
+==== tests/cases/compiler/jsxExcessPropsAndAssignability.tsx (3 errors) ====
///
import * as React from 'react';
@@ -17,10 +19,14 @@ tests/cases/compiler/jsxExcessPropsAndAssignability.tsx(16,6): error TS2322: Typ
// Expected no error, got none - good
;
+ ~~~~~
+!!! error TS2698: Spread types may only be created from object types.
// Expected error, but got none - bad!
;
~~~~~~~~~~~~~~~~
!!! error TS2322: Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes> & Readonly<{ children?: ReactNode; }> & Readonly'.
!!! error TS2322: Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'Readonly'.
+ ~~~~~
+!!! error TS2698: Spread types may only be created from object types.
};
\ No newline at end of file
diff --git a/tests/baselines/reference/jsxNamespacePrefixInName.errors.txt b/tests/baselines/reference/jsxNamespacePrefixInName.errors.txt
index 2eb3df02ad13a..a983e8736b03c 100644
--- a/tests/baselines/reference/jsxNamespacePrefixInName.errors.txt
+++ b/tests/baselines/reference/jsxNamespacePrefixInName.errors.txt
@@ -19,6 +19,7 @@ tests/cases/compiler/jsxNamespacePrefixInName.tsx(21,21): error TS1003: Identifi
tests/cases/compiler/jsxNamespacePrefixInName.tsx(22,26): error TS1003: Identifier expected.
tests/cases/compiler/jsxNamespacePrefixInName.tsx(22,27): error TS1003: Identifier expected.
tests/cases/compiler/jsxNamespacePrefixInName.tsx(22,29): error TS1005: '...' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(22,29): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,21): error TS1109: Expression expected.
tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,22): error TS1109: Expression expected.
tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,25): error TS1005: ',' expected.
@@ -29,7 +30,7 @@ tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,42): error TS1109: Expressi
tests/cases/compiler/jsxNamespacePrefixInName.tsx(25,24): error TS1003: Identifier expected.
-==== tests/cases/compiler/jsxNamespacePrefixInName.tsx (29 errors) ====
+==== tests/cases/compiler/jsxNamespacePrefixInName.tsx (30 errors) ====
var justElement1 = ;
var justElement2 = ;
var justElement3 = ;
@@ -94,6 +95,8 @@ tests/cases/compiler/jsxNamespacePrefixInName.tsx(25,24): error TS1003: Identifi
!!! error TS1003: Identifier expected.
~~~~~~~
!!! error TS1005: '...' expected.
+ ~~~~~~~
+!!! error TS2698: Spread types may only be created from object types.
var beginOfIdent1 = <:a attr={"value"} />;
~
diff --git a/tests/baselines/reference/jsxNamespacePrefixInNameReact.errors.txt b/tests/baselines/reference/jsxNamespacePrefixInNameReact.errors.txt
index 890fc67fc262a..bae65da057a4b 100644
--- a/tests/baselines/reference/jsxNamespacePrefixInNameReact.errors.txt
+++ b/tests/baselines/reference/jsxNamespacePrefixInNameReact.errors.txt
@@ -19,6 +19,7 @@ tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(23,21): error TS1003: Ide
tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(24,26): error TS1003: Identifier expected.
tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(24,27): error TS1003: Identifier expected.
tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(24,29): error TS1005: '...' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(24,29): error TS2698: Spread types may only be created from object types.
tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,21): error TS1109: Expression expected.
tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,22): error TS1109: Expression expected.
tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,25): error TS1005: ',' expected.
@@ -29,7 +30,7 @@ tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,42): error TS1109: Exp
tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(27,24): error TS1003: Identifier expected.
-==== tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx (29 errors) ====
+==== tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx (30 errors) ====
declare var React: any;
var justElement1 = ;
@@ -96,6 +97,8 @@ tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(27,24): error TS1003: Ide
!!! error TS1003: Identifier expected.
~~~~~~~
!!! error TS1005: '...' expected.
+ ~~~~~~~
+!!! error TS2698: Spread types may only be created from object types.
var beginOfIdent1 = <:a attr={"value"} />;
~
diff --git a/tests/baselines/reference/tsxSpreadInvalidType.errors.txt b/tests/baselines/reference/tsxSpreadInvalidType.errors.txt
new file mode 100644
index 0000000000000..4a0023deb1c97
--- /dev/null
+++ b/tests/baselines/reference/tsxSpreadInvalidType.errors.txt
@@ -0,0 +1,24 @@
+tests/cases/conformance/jsx/a.tsx(9,21): error TS2698: Spread types may only be created from object types.
+tests/cases/conformance/jsx/a.tsx(10,21): error TS2698: Spread types may only be created from object types.
+tests/cases/conformance/jsx/a.tsx(11,21): error TS2698: Spread types may only be created from object types.
+
+
+==== tests/cases/conformance/jsx/a.tsx (3 errors) ====
+ namespace JSX {
+ export interface IntrinsicElements { [key: string]: any }
+ }
+
+ const a = {} as never;
+ const b = null;
+ const c = undefined;
+
+ const d =
+ ~
+!!! error TS2698: Spread types may only be created from object types.
+ const e =
+ ~
+!!! error TS2698: Spread types may only be created from object types.
+ const f =
+ ~
+!!! error TS2698: Spread types may only be created from object types.
+
\ No newline at end of file
diff --git a/tests/baselines/reference/tsxSpreadInvalidType.js b/tests/baselines/reference/tsxSpreadInvalidType.js
new file mode 100644
index 0000000000000..5db598cd45f31
--- /dev/null
+++ b/tests/baselines/reference/tsxSpreadInvalidType.js
@@ -0,0 +1,22 @@
+//// [a.tsx]
+namespace JSX {
+ export interface IntrinsicElements { [key: string]: any }
+}
+
+const a = {} as never;
+const b = null;
+const c = undefined;
+
+const d =
+const e =
+const f =
+
+
+//// [a.jsx]
+"use strict";
+var a = {};
+var b = null;
+var c = undefined;
+var d = ;
+var e = ;
+var f = ;
diff --git a/tests/baselines/reference/tsxSpreadInvalidType.symbols b/tests/baselines/reference/tsxSpreadInvalidType.symbols
new file mode 100644
index 0000000000000..efb8d3cd58b8e
--- /dev/null
+++ b/tests/baselines/reference/tsxSpreadInvalidType.symbols
@@ -0,0 +1,34 @@
+=== tests/cases/conformance/jsx/a.tsx ===
+namespace JSX {
+>JSX : Symbol(JSX, Decl(a.tsx, 0, 0))
+
+ export interface IntrinsicElements { [key: string]: any }
+>IntrinsicElements : Symbol(IntrinsicElements, Decl(a.tsx, 0, 15))
+>key : Symbol(key, Decl(a.tsx, 1, 42))
+}
+
+const a = {} as never;
+>a : Symbol(a, Decl(a.tsx, 4, 5))
+
+const b = null;
+>b : Symbol(b, Decl(a.tsx, 5, 5))
+
+const c = undefined;
+>c : Symbol(c, Decl(a.tsx, 6, 5))
+>undefined : Symbol(undefined)
+
+const d =
+>d : Symbol(d, Decl(a.tsx, 8, 5))
+>div : Symbol(JSX.IntrinsicElements, Decl(a.tsx, 0, 15))
+>a : Symbol(a, Decl(a.tsx, 4, 5))
+
+const e =
+>e : Symbol(e, Decl(a.tsx, 9, 5))
+>div : Symbol(JSX.IntrinsicElements, Decl(a.tsx, 0, 15))
+>b : Symbol(b, Decl(a.tsx, 5, 5))
+
+const f =
+>f : Symbol(f, Decl(a.tsx, 10, 5))
+>div : Symbol(JSX.IntrinsicElements, Decl(a.tsx, 0, 15))
+>c : Symbol(c, Decl(a.tsx, 6, 5))
+
diff --git a/tests/baselines/reference/tsxSpreadInvalidType.types b/tests/baselines/reference/tsxSpreadInvalidType.types
new file mode 100644
index 0000000000000..e834f2f3f4be0
--- /dev/null
+++ b/tests/baselines/reference/tsxSpreadInvalidType.types
@@ -0,0 +1,37 @@
+=== tests/cases/conformance/jsx/a.tsx ===
+namespace JSX {
+ export interface IntrinsicElements { [key: string]: any }
+>key : string
+}
+
+const a = {} as never;
+>a : never
+>{} as never : never
+>{} : {}
+
+const b = null;
+>b : null
+>null : null
+
+const c = undefined;
+>c : undefined
+>undefined : undefined
+
+const d =
+>d : any
+> : any
+>div : any
+>a : never
+
+const e =
+>e : any
+> : any
+>div : any
+>b : null
+
+const f =
+>f : any
+> : any
+>div : any
+>c : undefined
+
diff --git a/tests/cases/conformance/jsx/tsxSpreadInvalidType.tsx b/tests/cases/conformance/jsx/tsxSpreadInvalidType.tsx
new file mode 100644
index 0000000000000..c06430dd7de12
--- /dev/null
+++ b/tests/cases/conformance/jsx/tsxSpreadInvalidType.tsx
@@ -0,0 +1,14 @@
+// @jsx: preserve
+// @strict: true
+// @filename: a.tsx
+namespace JSX {
+ export interface IntrinsicElements { [key: string]: any }
+}
+
+const a = {} as never;
+const b = null;
+const c = undefined;
+
+const d =
+const e =
+const f =