diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 21ea8c7347ebc..e962997ee02e5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -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)); } diff --git a/tests/baselines/reference/jsxPartialSpread.js b/tests/baselines/reference/jsxPartialSpread.js new file mode 100644 index 0000000000000..e37b12f7d7a4f --- /dev/null +++ b/tests/baselines/reference/jsxPartialSpread.js @@ -0,0 +1,26 @@ +//// [jsxPartialSpread.tsx] +/// +const Select = (p: {value?: unknown}) =>

; +import React from 'react'; + +export function Repro({ SelectProps = {} }: { SelectProps?: Partial[0]> }) { + return ( + ); +} +exports.Repro = Repro; diff --git a/tests/baselines/reference/jsxPartialSpread.symbols b/tests/baselines/reference/jsxPartialSpread.symbols new file mode 100644 index 0000000000000..7b0a171064992 --- /dev/null +++ b/tests/baselines/reference/jsxPartialSpread.symbols @@ -0,0 +1,28 @@ +=== tests/cases/compiler/jsxPartialSpread.tsx === +/// +const Select = (p: {value?: unknown}) =>

; +>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[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 ( + ) : JSX.Element + + : JSX.Element +>Select : (p: { value?: unknown; }) => JSX.Element +>value : string +>'test' : "test" +>SelectProps : Partial<{ value?: unknown; }> + + ); +} diff --git a/tests/cases/compiler/jsxPartialSpread.tsx b/tests/cases/compiler/jsxPartialSpread.tsx new file mode 100644 index 0000000000000..b71ee00e5d928 --- /dev/null +++ b/tests/cases/compiler/jsxPartialSpread.tsx @@ -0,0 +1,12 @@ +// @jsx: preserve +// @esModuleInterop: true +// @strict: true +/// +const Select = (p: {value?: unknown}) =>

; +import React from 'react'; + +export function Repro({ SelectProps = {} }: { SelectProps?: Partial[0]> }) { + return ( +