From 1184084b83a3e1c9bfcbf376ad4b21132edc0436 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 5 Apr 2022 16:12:16 +0300 Subject: [PATCH] fix(48556): throw an error on jsx spread attributes with an invalid type --- src/compiler/checker.ts | 1 + ...correctlyMarkAliasAsReferences3.errors.txt | 18 +++++++++ .../jsxExcessPropsAndAssignability.errors.txt | 8 +++- .../jsxNamespacePrefixInName.errors.txt | 5 ++- .../jsxNamespacePrefixInNameReact.errors.txt | 5 ++- .../reference/tsxSpreadInvalidType.errors.txt | 24 ++++++++++++ .../reference/tsxSpreadInvalidType.js | 22 +++++++++++ .../reference/tsxSpreadInvalidType.symbols | 34 +++++++++++++++++ .../reference/tsxSpreadInvalidType.types | 37 +++++++++++++++++++ .../conformance/jsx/tsxSpreadInvalidType.tsx | 14 +++++++ 10 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/correctlyMarkAliasAsReferences3.errors.txt create mode 100644 tests/baselines/reference/tsxSpreadInvalidType.errors.txt create mode 100644 tests/baselines/reference/tsxSpreadInvalidType.js create mode 100644 tests/baselines/reference/tsxSpreadInvalidType.symbols create mode 100644 tests/baselines/reference/tsxSpreadInvalidType.types create mode 100644 tests/cases/conformance/jsx/tsxSpreadInvalidType.tsx 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 =
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy