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:
Nathan Shively-Sanders 2017-11-13 16:06:19 -08:00 committed by GitHub
commit 5d5da4c1b7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 92 additions and 1 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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))

View file

@ -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

View file

@ -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}