From 7b0e74d91a02f0da8993f6dec401cf4cad6bc8bf Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Tue, 3 Oct 2017 12:41:33 -0700 Subject: [PATCH 1/2] Binding pattern contextual type checks spread type The spread type can contain properties that have been built up during the construction of the object literal. --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8c9b818cd79..6cdad32751c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13890,7 +13890,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 || (prop).bindingElement, Diagnostics.Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value); From 2c04b5510fcf735775a0891cab7283864e923ca1 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Tue, 3 Oct 2017 12:43:23 -0700 Subject: [PATCH 2/2] Test:spread contextually typed by binding pattern --- .../spreadContextualTypedBindingPattern.js | 25 +++++++++++++++++ ...preadContextualTypedBindingPattern.symbols | 27 ++++++++++++++++++ .../spreadContextualTypedBindingPattern.types | 28 +++++++++++++++++++ .../spreadContextualTypedBindingPattern.ts | 11 ++++++++ 4 files changed, 91 insertions(+) create mode 100644 tests/baselines/reference/spreadContextualTypedBindingPattern.js create mode 100644 tests/baselines/reference/spreadContextualTypedBindingPattern.symbols create mode 100644 tests/baselines/reference/spreadContextualTypedBindingPattern.types create mode 100644 tests/cases/conformance/types/spread/spreadContextualTypedBindingPattern.ts diff --git a/tests/baselines/reference/spreadContextualTypedBindingPattern.js b/tests/baselines/reference/spreadContextualTypedBindingPattern.js new file mode 100644 index 00000000000..a97a3124886 --- /dev/null +++ b/tests/baselines/reference/spreadContextualTypedBindingPattern.js @@ -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; diff --git a/tests/baselines/reference/spreadContextualTypedBindingPattern.symbols b/tests/baselines/reference/spreadContextualTypedBindingPattern.symbols new file mode 100644 index 00000000000..260ac282b07 --- /dev/null +++ b/tests/baselines/reference/spreadContextualTypedBindingPattern.symbols @@ -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)) + diff --git a/tests/baselines/reference/spreadContextualTypedBindingPattern.types b/tests/baselines/reference/spreadContextualTypedBindingPattern.types new file mode 100644 index 00000000000..c58fb9e357e --- /dev/null +++ b/tests/baselines/reference/spreadContextualTypedBindingPattern.types @@ -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 + diff --git a/tests/cases/conformance/types/spread/spreadContextualTypedBindingPattern.ts b/tests/cases/conformance/types/spread/spreadContextualTypedBindingPattern.ts new file mode 100644 index 00000000000..1414c5f278b --- /dev/null +++ b/tests/cases/conformance/types/spread/spreadContextualTypedBindingPattern.ts @@ -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}