From da41217f435ca49647eb77ebafb4e293f7223bf6 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 4 Oct 2017 15:15:29 -0700 Subject: [PATCH 1/2] Binding element with parent type any is any Previously if the binding element had an initializer, then that type would be used. But this is incorrect: ```ts function f(x: any) { let { d = 1 } = x; // d should have type any not number. // f can be called with anything: } f({ d: 0 }); f({ d: 'hi' }); f({}); ``` --- src/compiler/checker.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fbe192c5629..347d8c911f3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4151,13 +4151,13 @@ namespace ts { if (parentType === unknownType) { return unknownType; } - // If no type was specified or inferred for parent, or if the specified or inferred type is any, - // infer from the initializer of the binding element if one is present. Otherwise, go with the - // undefined or any type of the parent. - if (!parentType || isTypeAny(parentType)) { - if (declaration.initializer) { - return checkDeclarationInitializer(declaration); - } + // If no type was specified or inferred for parent, + // infer from the initializer of the binding element if one is present. + // Otherwise, go with the undefined type of the parent. + if (!parentType) { + return declaration.initializer ? checkDeclarationInitializer(declaration) : parentType; + } + if (isTypeAny(parentType)) { return parentType; } @@ -4183,9 +4183,6 @@ namespace ts { // computed properties with non-literal names are treated as 'any' return anyType; } - if (declaration.initializer) { - getContextualType(declaration.initializer); - } // Use type of the specified property, or otherwise, for a numeric name, the type of the numeric index signature, // or otherwise the type of the string index signature. From 2ae70a1c2bea93b2f7a589ba8cc2cb830b64cbef Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 4 Oct 2017 15:24:23 -0700 Subject: [PATCH 2/2] Update baselines --- ...cturingArrayBindingPatternAndAssignment1ES5.types | 4 ++-- ...rrayBindingPatternAndAssignment1ES5iterable.types | 4 ++-- ...cturingArrayBindingPatternAndAssignment1ES6.types | 4 ++-- ...turingObjectBindingPatternAndAssignment1ES5.types | 2 +- ...turingObjectBindingPatternAndAssignment1ES6.types | 2 +- ...ructuringObjectBindingPatternAndAssignment4.types | 12 ++++++------ tests/baselines/reference/objectRestParameter.types | 2 +- .../baselines/reference/objectRestParameterES5.types | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5.types b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5.types index e2a6174e61f..d0d8561b808 100644 --- a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5.types +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5.types @@ -28,9 +28,9 @@ var [a0, a1]: any = undefined; >undefined : undefined var [a2 = false, a3 = 1]: any = undefined; ->a2 : boolean +>a2 : any >false : false ->a3 : number +>a3 : any >1 : 1 >undefined : undefined diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5iterable.types b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5iterable.types index a650bbad2d2..09dc481c477 100644 --- a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5iterable.types +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES5iterable.types @@ -28,9 +28,9 @@ var [a0, a1]: any = undefined; >undefined : undefined var [a2 = false, a3 = 1]: any = undefined; ->a2 : boolean +>a2 : any >false : false ->a3 : number +>a3 : any >1 : 1 >undefined : undefined diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES6.types b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES6.types index b6f54b55799..a07ea6ca017 100644 --- a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES6.types +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1ES6.types @@ -28,9 +28,9 @@ var [a0, a1]: any = undefined; >undefined : undefined var [a2 = false, a3 = 1]: any = undefined; ->a2 : boolean +>a2 : any >false : false ->a3 : number +>a3 : any >1 : 1 >undefined : undefined diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1ES5.types b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1ES5.types index e0aedcbb167..203815fa9c8 100644 --- a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1ES5.types +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1ES5.types @@ -39,7 +39,7 @@ var {1: b3} = { 1: "string" }; >"string" : "string" var {b4 = 1}: any = { b4: 100000 }; ->b4 : number +>b4 : any >1 : 1 >{ b4: 100000 } : { b4: number; } >b4 : number diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1ES6.types b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1ES6.types index 7d68d32ac51..1c3d1f4d00c 100644 --- a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1ES6.types +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1ES6.types @@ -39,7 +39,7 @@ var {1: b3} = { 1: "string" }; >"string" : "string" var {b4 = 1}: any = { b4: 100000 }; ->b4 : number +>b4 : any >1 : 1 >{ b4: 100000 } : { b4: number; } >b4 : number diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.types b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.types index 24f7e8ed0ba..104c694fbbd 100644 --- a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.types +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.types @@ -1,20 +1,20 @@ === tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment4.ts === const { a = 1, ->a : 1 +>a : any >1 : 1 b = 2, ->b : 2 +>b : any >2 : 2 c = b, // ok ->c : 2 ->b : 2 +>c : any +>b : any d = a, // ok ->d : 1 ->a : 1 +>d : any +>a : any e = f, // error >e : any diff --git a/tests/baselines/reference/objectRestParameter.types b/tests/baselines/reference/objectRestParameter.types index 3d0d1bb619b..831ac9df59f 100644 --- a/tests/baselines/reference/objectRestParameter.types +++ b/tests/baselines/reference/objectRestParameter.types @@ -77,7 +77,7 @@ class C { } function foobar({ bar={}, ...opts }: any = {}) { >foobar : ({ bar, ...opts }?: any) => void ->bar : {} +>bar : any >{} : {} >opts : any >{} : {} diff --git a/tests/baselines/reference/objectRestParameterES5.types b/tests/baselines/reference/objectRestParameterES5.types index e0ebee39317..1b8dd29e29e 100644 --- a/tests/baselines/reference/objectRestParameterES5.types +++ b/tests/baselines/reference/objectRestParameterES5.types @@ -77,7 +77,7 @@ class C { } function foobar({ bar={}, ...opts }: any = {}) { >foobar : ({ bar, ...opts }?: any) => void ->bar : {} +>bar : any >{} : {} >opts : any >{} : {}