Merge pull request #18925 from Microsoft/fix-spread-contextually-typed-by-binding-pattern
Fix object spread that is contextually typed by a binding pattern
This commit is contained in:
commit
5d5da4c1b7
5 changed files with 92 additions and 1 deletions
|
@ -14200,7 +14200,7 @@ namespace ts {
|
|||
// type with those properties for which the binding pattern specifies a default value.
|
||||
if (contextualTypeHasPattern) {
|
||||
for (const prop of getPropertiesOfType(contextualType)) {
|
||||
if (!propertiesTable.get(prop.escapedName)) {
|
||||
if (!propertiesTable.get(prop.escapedName) && !(spread && getPropertyOfType(spread, prop.escapedName))) {
|
||||
if (!(prop.flags & SymbolFlags.Optional)) {
|
||||
error(prop.valueDeclaration || (<TransientSymbol>prop).bindingElement,
|
||||
Diagnostics.Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value);
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
//// [spreadContextualTypedBindingPattern.ts]
|
||||
// #18308
|
||||
interface Person {
|
||||
naam: string,
|
||||
age: number
|
||||
}
|
||||
|
||||
declare const bob: Person
|
||||
declare const alice: Person
|
||||
|
||||
// [ts] Initializer provides no value for this binding element and the binding element has no default value.
|
||||
const { naam, age } = {...bob, ...alice}
|
||||
|
||||
|
||||
//// [spreadContextualTypedBindingPattern.js]
|
||||
var __assign = (this && this.__assign) || Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
// [ts] Initializer provides no value for this binding element and the binding element has no default value.
|
||||
var _a = __assign({}, bob, alice), naam = _a.naam, age = _a.age;
|
|
@ -0,0 +1,27 @@
|
|||
=== tests/cases/conformance/types/spread/spreadContextualTypedBindingPattern.ts ===
|
||||
// #18308
|
||||
interface Person {
|
||||
>Person : Symbol(Person, Decl(spreadContextualTypedBindingPattern.ts, 0, 0))
|
||||
|
||||
naam: string,
|
||||
>naam : Symbol(Person.naam, Decl(spreadContextualTypedBindingPattern.ts, 1, 18))
|
||||
|
||||
age: number
|
||||
>age : Symbol(Person.age, Decl(spreadContextualTypedBindingPattern.ts, 2, 15))
|
||||
}
|
||||
|
||||
declare const bob: Person
|
||||
>bob : Symbol(bob, Decl(spreadContextualTypedBindingPattern.ts, 6, 13))
|
||||
>Person : Symbol(Person, Decl(spreadContextualTypedBindingPattern.ts, 0, 0))
|
||||
|
||||
declare const alice: Person
|
||||
>alice : Symbol(alice, Decl(spreadContextualTypedBindingPattern.ts, 7, 13))
|
||||
>Person : Symbol(Person, Decl(spreadContextualTypedBindingPattern.ts, 0, 0))
|
||||
|
||||
// [ts] Initializer provides no value for this binding element and the binding element has no default value.
|
||||
const { naam, age } = {...bob, ...alice}
|
||||
>naam : Symbol(naam, Decl(spreadContextualTypedBindingPattern.ts, 10, 7))
|
||||
>age : Symbol(age, Decl(spreadContextualTypedBindingPattern.ts, 10, 13))
|
||||
>bob : Symbol(bob, Decl(spreadContextualTypedBindingPattern.ts, 6, 13))
|
||||
>alice : Symbol(alice, Decl(spreadContextualTypedBindingPattern.ts, 7, 13))
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
=== tests/cases/conformance/types/spread/spreadContextualTypedBindingPattern.ts ===
|
||||
// #18308
|
||||
interface Person {
|
||||
>Person : Person
|
||||
|
||||
naam: string,
|
||||
>naam : string
|
||||
|
||||
age: number
|
||||
>age : number
|
||||
}
|
||||
|
||||
declare const bob: Person
|
||||
>bob : Person
|
||||
>Person : Person
|
||||
|
||||
declare const alice: Person
|
||||
>alice : Person
|
||||
>Person : Person
|
||||
|
||||
// [ts] Initializer provides no value for this binding element and the binding element has no default value.
|
||||
const { naam, age } = {...bob, ...alice}
|
||||
>naam : string
|
||||
>age : number
|
||||
>{...bob, ...alice} : { naam: string; age: number; }
|
||||
>bob : Person
|
||||
>alice : Person
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
// #18308
|
||||
interface Person {
|
||||
naam: string,
|
||||
age: number
|
||||
}
|
||||
|
||||
declare const bob: Person
|
||||
declare const alice: Person
|
||||
|
||||
// [ts] Initializer provides no value for this binding element and the binding element has no default value.
|
||||
const { naam, age } = {...bob, ...alice}
|
Loading…
Reference in a new issue