File tree Expand file tree Collapse file tree 2 files changed +47
-1
lines changed Expand file tree Collapse file tree 2 files changed +47
-1
lines changed Original file line number Diff line number Diff line change @@ -3504,7 +3504,18 @@ namespace ts {
3504
3504
// We don't want to complete using the type acquired by the shape
3505
3505
// of the binding pattern; we are only interested in types acquired
3506
3506
// through type declaration or inference.
3507
- if ( rootDeclaration . initializer || rootDeclaration . type ) {
3507
+ // Also proceed if rootDeclaration is parameter and if its containing function expression\arrow function is contextually typed -
3508
+ // type of parameter will flow in from the contextual type of the function
3509
+ let canGetType = ! ! ( rootDeclaration . initializer || rootDeclaration . type ) ;
3510
+ if ( ! canGetType && rootDeclaration . kind === SyntaxKind . Parameter ) {
3511
+ if ( isExpression ( rootDeclaration . parent ) ) {
3512
+ canGetType = ! ! typeChecker . getContextualType ( < Expression > rootDeclaration . parent ) ;
3513
+ }
3514
+ else if ( rootDeclaration . parent . kind === SyntaxKind . MethodDeclaration || rootDeclaration . parent . kind === SyntaxKind . SetAccessor ) {
3515
+ canGetType = isExpression ( rootDeclaration . parent . parent ) && ! ! typeChecker . getContextualType ( < Expression > rootDeclaration . parent . parent ) ;
3516
+ }
3517
+ }
3518
+ if ( canGetType ) {
3508
3519
typeForObject = typeChecker . getTypeAtLocation ( objectLikeContainer ) ;
3509
3520
existingMembers = ( < BindingPattern > objectLikeContainer ) . elements ;
3510
3521
}
Original file line number Diff line number Diff line change
1
+ /// <reference path="fourslash.ts"/>
2
+
3
+ ////interface I { x1: number; x2: string }
4
+ ////function f(cb: (ev: I) => any) { }
5
+ ////f(({/*1*/}) => 0);
6
+
7
+ ////[<I>null].reduce(({/*2*/}, b) => b);
8
+
9
+ ////interface Foo {
10
+ //// m(x: { x1: number, x2: number }): void;
11
+ //// prop: I;
12
+ //// }
13
+ ////let x: Foo = {
14
+ //// m({ /*3*/ }) {
15
+ //// },
16
+ //// get prop(): I { return undefined; },
17
+ //// set prop({ /*4*/ }) {
18
+ //// }
19
+ //// };
20
+
21
+ goTo . marker ( "1" ) ;
22
+ verify . completionListContains ( "x1" ) ;
23
+ verify . completionListContains ( "x2" ) ;
24
+
25
+ goTo . marker ( "2" ) ;
26
+ verify . completionListContains ( "x1" ) ;
27
+ verify . completionListContains ( "x2" ) ;
28
+
29
+ goTo . marker ( "3" ) ;
30
+ verify . completionListContains ( "x1" ) ;
31
+ verify . completionListContains ( "x2" ) ;
32
+
33
+ goTo . marker ( "4" ) ;
34
+ verify . completionListContains ( "x1" ) ;
35
+ verify . completionListContains ( "x2" ) ;
You can’t perform that action at this time.
0 commit comments