Ignore data- props when excess property checking (#36952)

This commit is contained in:
Wesley Wigham 2020-02-25 15:52:24 -08:00 committed by GitHub
parent d92aca2715
commit e99173a6f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 96 additions and 1 deletions

View File

@ -15378,7 +15378,7 @@ namespace ts {
checkTypes = reducedTarget.flags & TypeFlags.Union ? (<UnionType>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

View File

@ -0,0 +1,21 @@
//// [tsxUnionMemberChecksFilterDataProps.tsx]
/// <reference path="/.lib/react16.d.ts" />
import React, { ReactElement } from "react";
declare function NotHappy(props: ({ fixed?: boolean } | { value?: number })): ReactElement<any>;
declare function Happy(props: { fixed?: boolean, value?: number }): ReactElement<any>;
const RootNotHappy = () => (<NotHappy data-testid="my-test-id" />);
const RootHappy = () => (<Happy data-testid="my-test-id" />);
//// [tsxUnionMemberChecksFilterDataProps.js]
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
exports.__esModule = true;
/// <reference path="react16.d.ts" />
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" })); };

View File

@ -0,0 +1,30 @@
=== tests/cases/compiler/tsxUnionMemberChecksFilterDataProps.tsx ===
/// <reference path="react16.d.ts" />
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<any>;
>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<any>;
>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 = () => (<NotHappy data-testid="my-test-id" />);
>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 = () => (<Happy data-testid="my-test-id" />);
>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))

View File

@ -0,0 +1,34 @@
=== tests/cases/compiler/tsxUnionMemberChecksFilterDataProps.tsx ===
/// <reference path="react16.d.ts" />
import React, { ReactElement } from "react";
>React : typeof React
>ReactElement : any
declare function NotHappy(props: ({ fixed?: boolean } | { value?: number })): ReactElement<any>;
>NotHappy : (props: { fixed?: boolean; } | { value?: number; }) => React.ReactElement<any>
>props : { fixed?: boolean; } | { value?: number; }
>fixed : boolean
>value : number
declare function Happy(props: { fixed?: boolean, value?: number }): ReactElement<any>;
>Happy : (props: { fixed?: boolean; value?: number; }) => React.ReactElement<any>
>props : { fixed?: boolean; value?: number; }
>fixed : boolean
>value : number
const RootNotHappy = () => (<NotHappy data-testid="my-test-id" />);
>RootNotHappy : () => JSX.Element
>() => (<NotHappy data-testid="my-test-id" />) : () => JSX.Element
>(<NotHappy data-testid="my-test-id" />) : JSX.Element
><NotHappy data-testid="my-test-id" /> : JSX.Element
>NotHappy : (props: { fixed?: boolean; } | { value?: number; }) => React.ReactElement<any>
>data-testid : string
const RootHappy = () => (<Happy data-testid="my-test-id" />);
>RootHappy : () => JSX.Element
>() => (<Happy data-testid="my-test-id" />) : () => JSX.Element
>(<Happy data-testid="my-test-id" />) : JSX.Element
><Happy data-testid="my-test-id" /> : JSX.Element
>Happy : (props: { fixed?: boolean; value?: number; }) => React.ReactElement<any>
>data-testid : string

View File

@ -0,0 +1,10 @@
// @jsx: react
// @esModuleInterop: true
/// <reference path="/.lib/react16.d.ts" />
import React, { ReactElement } from "react";
declare function NotHappy(props: ({ fixed?: boolean } | { value?: number })): ReactElement<any>;
declare function Happy(props: { fixed?: boolean, value?: number }): ReactElement<any>;
const RootNotHappy = () => (<NotHappy data-testid="my-test-id" />);
const RootHappy = () => (<Happy data-testid="my-test-id" />);