Include unknown in spread prop override check (#38577)

This commit is contained in:
Wesley Wigham 2020-05-14 14:36:38 -07:00 committed by GitHub
parent 89f7797f7e
commit 7fc456f2d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 100 additions and 1 deletions

View File

@ -23592,7 +23592,7 @@ namespace ts {
for (const right of getPropertiesOfType(type)) {
const left = props.get(right.escapedName);
const rightType = getTypeOfSymbol(right);
if (left && !maybeTypeOfKind(rightType, TypeFlags.Nullable) && !(maybeTypeOfKind(rightType, TypeFlags.Any) && right.flags & SymbolFlags.Optional)) {
if (left && !maybeTypeOfKind(rightType, TypeFlags.Nullable) && !(maybeTypeOfKind(rightType, TypeFlags.AnyOrUnknown) && right.flags & SymbolFlags.Optional)) {
const diagnostic = error(left.valueDeclaration, Diagnostics._0_is_specified_more_than_once_so_this_usage_will_be_overwritten, unescapeLeadingUnderscores(left.escapedName));
addRelatedInfo(diagnostic, createDiagnosticForNode(spread, Diagnostics.This_spread_always_overwrites_this_property));
}

View File

@ -0,0 +1,26 @@
//// [jsxPartialSpread.tsx]
/// <reference path="/.lib/react16.d.ts" />
const Select = (p: {value?: unknown}) => <p></p>;
import React from 'react';
export function Repro({ SelectProps = {} }: { SelectProps?: Partial<Parameters<typeof Select>[0]> }) {
return (
<Select value={'test'} {...SelectProps} />
);
}
//// [jsxPartialSpread.jsx]
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
exports.__esModule = true;
exports.Repro = void 0;
/// <reference path="react16.d.ts" />
var Select = function (p) { return <p></p>; };
var react_1 = __importDefault(require("react"));
function Repro(_a) {
var _b = _a.SelectProps, SelectProps = _b === void 0 ? {} : _b;
return (<Select value={'test'} {...SelectProps}/>);
}
exports.Repro = Repro;

View File

@ -0,0 +1,28 @@
=== tests/cases/compiler/jsxPartialSpread.tsx ===
/// <reference path="react16.d.ts" />
const Select = (p: {value?: unknown}) => <p></p>;
>Select : Symbol(Select, Decl(jsxPartialSpread.tsx, 1, 5))
>p : Symbol(p, Decl(jsxPartialSpread.tsx, 1, 16))
>value : Symbol(value, Decl(jsxPartialSpread.tsx, 1, 20))
>p : Symbol(JSX.IntrinsicElements.p, Decl(react16.d.ts, 2467, 102))
>p : Symbol(JSX.IntrinsicElements.p, Decl(react16.d.ts, 2467, 102))
import React from 'react';
>React : Symbol(React, Decl(jsxPartialSpread.tsx, 2, 6))
export function Repro({ SelectProps = {} }: { SelectProps?: Partial<Parameters<typeof Select>[0]> }) {
>Repro : Symbol(Repro, Decl(jsxPartialSpread.tsx, 2, 26))
>SelectProps : Symbol(SelectProps, Decl(jsxPartialSpread.tsx, 4, 23))
>SelectProps : Symbol(SelectProps, Decl(jsxPartialSpread.tsx, 4, 45))
>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --))
>Parameters : Symbol(Parameters, Decl(lib.es5.d.ts, --, --))
>Select : Symbol(Select, Decl(jsxPartialSpread.tsx, 1, 5))
return (
<Select value={'test'} {...SelectProps} />
>Select : Symbol(Select, Decl(jsxPartialSpread.tsx, 1, 5))
>value : Symbol(value, Decl(jsxPartialSpread.tsx, 6, 15))
>SelectProps : Symbol(SelectProps, Decl(jsxPartialSpread.tsx, 4, 23))
);
}

View File

@ -0,0 +1,33 @@
=== tests/cases/compiler/jsxPartialSpread.tsx ===
/// <reference path="react16.d.ts" />
const Select = (p: {value?: unknown}) => <p></p>;
>Select : (p: { value?: unknown;}) => JSX.Element
>(p: {value?: unknown}) => <p></p> : (p: { value?: unknown;}) => JSX.Element
>p : { value?: unknown; }
>value : unknown
><p></p> : JSX.Element
>p : { value?: unknown; }
>p : { value?: unknown; }
import React from 'react';
>React : typeof React
export function Repro({ SelectProps = {} }: { SelectProps?: Partial<Parameters<typeof Select>[0]> }) {
>Repro : ({ SelectProps }: { SelectProps?: Partial<Parameters<typeof Select>[0]>;}) => JSX.Element
>SelectProps : Partial<{ value?: unknown; }>
>{} : {}
>SelectProps : Partial<{ value?: unknown; }> | undefined
>Select : (p: { value?: unknown; }) => JSX.Element
return (
>( <Select value={'test'} {...SelectProps} /> ) : JSX.Element
<Select value={'test'} {...SelectProps} />
><Select value={'test'} {...SelectProps} /> : JSX.Element
>Select : (p: { value?: unknown; }) => JSX.Element
>value : string
>'test' : "test"
>SelectProps : Partial<{ value?: unknown; }>
);
}

View File

@ -0,0 +1,12 @@
// @jsx: preserve
// @esModuleInterop: true
// @strict: true
/// <reference path="/.lib/react16.d.ts" />
const Select = (p: {value?: unknown}) => <p></p>;
import React from 'react';
export function Repro({ SelectProps = {} }: { SelectProps?: Partial<Parameters<typeof Select>[0]> }) {
return (
<Select value={'test'} {...SelectProps} />
);
}