Skip to content

Commit

Permalink
🤖 Pick PR #38577 (Include unknown in spread prop over...) into releas…
Browse files Browse the repository at this point in the history
…e-3.9 (#38581)

* Cherry-pick PR #38577 into release-3.9

Component commits:
e5bccaf Include unknown in spread prop override check

* Empty commit

Co-authored-by: Wesley Wigham <t-weswig@microsoft.com>
Co-authored-by: Wesley Wigham <wwigham@gmail.com>
  • Loading branch information
3 people committed May 14, 2020
1 parent e354d47 commit 8037e26
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23529,7 +23529,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));
}
Expand Down
26 changes: 26 additions & 0 deletions tests/baselines/reference/jsxPartialSpread.js
Original file line number Diff line number Diff line change
@@ -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;
28 changes: 28 additions & 0 deletions tests/baselines/reference/jsxPartialSpread.symbols
Original file line number Diff line number Diff line change
@@ -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))

);
}
33 changes: 33 additions & 0 deletions tests/baselines/reference/jsxPartialSpread.types
Original file line number Diff line number Diff line change
@@ -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; }>

);
}
12 changes: 12 additions & 0 deletions tests/cases/compiler/jsxPartialSpread.tsx
Original file line number Diff line number Diff line change
@@ -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} />
);
}

0 comments on commit 8037e26

Please sign in to comment.