diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c9eb2d49b9b..98e1a8255eb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15378,7 +15378,7 @@ namespace ts { checkTypes = reducedTarget.flags & TypeFlags.Union ? (reducedTarget).types : [reducedTarget]; } for (const prop of getPropertiesOfType(source)) { - if (shouldCheckAsExcessProperty(prop, source.symbol)) { + if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { // Report error in terms of object types in the target as those are the only ones diff --git a/tests/baselines/reference/tsxUnionMemberChecksFilterDataProps.js b/tests/baselines/reference/tsxUnionMemberChecksFilterDataProps.js new file mode 100644 index 00000000000..3bc4d40c316 --- /dev/null +++ b/tests/baselines/reference/tsxUnionMemberChecksFilterDataProps.js @@ -0,0 +1,21 @@ +//// [tsxUnionMemberChecksFilterDataProps.tsx] +/// +import React, { ReactElement } from "react"; + +declare function NotHappy(props: ({ fixed?: boolean } | { value?: number })): ReactElement; +declare function Happy(props: { fixed?: boolean, value?: number }): ReactElement; + +const RootNotHappy = () => (); +const RootHappy = () => (); + + +//// [tsxUnionMemberChecksFilterDataProps.js] +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +exports.__esModule = true; +/// +var react_1 = __importDefault(require("react")); +var RootNotHappy = function () { return (react_1["default"].createElement(NotHappy, { "data-testid": "my-test-id" })); }; +var RootHappy = function () { return (react_1["default"].createElement(Happy, { "data-testid": "my-test-id" })); }; diff --git a/tests/baselines/reference/tsxUnionMemberChecksFilterDataProps.symbols b/tests/baselines/reference/tsxUnionMemberChecksFilterDataProps.symbols new file mode 100644 index 00000000000..77f47363b4c --- /dev/null +++ b/tests/baselines/reference/tsxUnionMemberChecksFilterDataProps.symbols @@ -0,0 +1,30 @@ +=== tests/cases/compiler/tsxUnionMemberChecksFilterDataProps.tsx === +/// +import React, { ReactElement } from "react"; +>React : Symbol(React, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 1, 6)) +>ReactElement : Symbol(ReactElement, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 1, 15)) + +declare function NotHappy(props: ({ fixed?: boolean } | { value?: number })): ReactElement; +>NotHappy : Symbol(NotHappy, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 1, 44)) +>props : Symbol(props, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 3, 26)) +>fixed : Symbol(fixed, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 3, 35)) +>value : Symbol(value, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 3, 57)) +>ReactElement : Symbol(ReactElement, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 1, 15)) + +declare function Happy(props: { fixed?: boolean, value?: number }): ReactElement; +>Happy : Symbol(Happy, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 3, 96)) +>props : Symbol(props, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 4, 23)) +>fixed : Symbol(fixed, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 4, 31)) +>value : Symbol(value, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 4, 48)) +>ReactElement : Symbol(ReactElement, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 1, 15)) + +const RootNotHappy = () => (); +>RootNotHappy : Symbol(RootNotHappy, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 6, 5)) +>NotHappy : Symbol(NotHappy, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 1, 44)) +>data-testid : Symbol(data-testid, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 6, 37)) + +const RootHappy = () => (); +>RootHappy : Symbol(RootHappy, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 7, 5)) +>Happy : Symbol(Happy, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 3, 96)) +>data-testid : Symbol(data-testid, Decl(tsxUnionMemberChecksFilterDataProps.tsx, 7, 31)) + diff --git a/tests/baselines/reference/tsxUnionMemberChecksFilterDataProps.types b/tests/baselines/reference/tsxUnionMemberChecksFilterDataProps.types new file mode 100644 index 00000000000..d0be74dae84 --- /dev/null +++ b/tests/baselines/reference/tsxUnionMemberChecksFilterDataProps.types @@ -0,0 +1,34 @@ +=== tests/cases/compiler/tsxUnionMemberChecksFilterDataProps.tsx === +/// +import React, { ReactElement } from "react"; +>React : typeof React +>ReactElement : any + +declare function NotHappy(props: ({ fixed?: boolean } | { value?: number })): ReactElement; +>NotHappy : (props: { fixed?: boolean; } | { value?: number; }) => React.ReactElement +>props : { fixed?: boolean; } | { value?: number; } +>fixed : boolean +>value : number + +declare function Happy(props: { fixed?: boolean, value?: number }): ReactElement; +>Happy : (props: { fixed?: boolean; value?: number; }) => React.ReactElement +>props : { fixed?: boolean; value?: number; } +>fixed : boolean +>value : number + +const RootNotHappy = () => (); +>RootNotHappy : () => JSX.Element +>() => () : () => JSX.Element +>() : JSX.Element +> : JSX.Element +>NotHappy : (props: { fixed?: boolean; } | { value?: number; }) => React.ReactElement +>data-testid : string + +const RootHappy = () => (); +>RootHappy : () => JSX.Element +>() => () : () => JSX.Element +>() : JSX.Element +> : JSX.Element +>Happy : (props: { fixed?: boolean; value?: number; }) => React.ReactElement +>data-testid : string + diff --git a/tests/cases/compiler/tsxUnionMemberChecksFilterDataProps.tsx b/tests/cases/compiler/tsxUnionMemberChecksFilterDataProps.tsx new file mode 100644 index 00000000000..8c49e4ff8bb --- /dev/null +++ b/tests/cases/compiler/tsxUnionMemberChecksFilterDataProps.tsx @@ -0,0 +1,10 @@ +// @jsx: react +// @esModuleInterop: true +/// +import React, { ReactElement } from "react"; + +declare function NotHappy(props: ({ fixed?: boolean } | { value?: number })): ReactElement; +declare function Happy(props: { fixed?: boolean, value?: number }): ReactElement; + +const RootNotHappy = () => (); +const RootHappy = () => ();