Skip to content

Commit c3bcc4c

Browse files
committed
Revert binding pattern inference changes, but only for tuples
1 parent 9f12799 commit c3bcc4c

8 files changed

+70
-9
lines changed

Diff for: src/compiler/checker.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -25442,7 +25442,8 @@ namespace ts {
2544225442
if (result) {
2544325443
return result;
2544425444
}
25445-
if (!(contextFlags! & ContextFlags.SkipBindingPatterns) && isBindingPattern(declaration.name)) {
25445+
if (!(contextFlags! & ContextFlags.SkipObjectBindingPatterns) && isObjectBindingPattern(declaration.name) ||
25446+
!(contextFlags! & ContextFlags.SkipArrayBindingPatterns) && isArrayBindingPattern(declaration.name)) {
2544625447
// This is less a contextual type and more an implied shape - in some cases, this may be undesirable
2544725448
return getTypeFromBindingPattern(declaration.name, /*includePatternInType*/ true, /*reportErrors*/ false);
2544825449
}
@@ -28750,7 +28751,7 @@ namespace ts {
2875028751
// 'let f: (x: string) => number = wrap(s => s.length)', we infer from the declared type of 'f' to the
2875128752
// return type of 'wrap'.
2875228753
if (node.kind !== SyntaxKind.Decorator) {
28753-
const contextualType = getContextualType(node, ContextFlags.SkipBindingPatterns);
28754+
const contextualType = getContextualType(node, ContextFlags.SkipObjectBindingPatterns);
2875428755
if (contextualType) {
2875528756
// We clone the inference context to avoid disturbing a resolution in progress for an
2875628757
// outer call expression. Effectively we just want a snapshot of whatever has been

Diff for: src/compiler/types.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -4409,7 +4409,9 @@ namespace ts {
44094409
Signature = 1 << 0, // Obtaining contextual signature
44104410
NoConstraints = 1 << 1, // Don't obtain type variable constraints
44114411
Completions = 1 << 2, // Ignore inference to current node and parent nodes out to the containing call for completions
4412-
SkipBindingPatterns = 1 << 3, // Ignore contextual types applied by binding patterns
4412+
SkipArrayBindingPatterns = 1 << 3, // Ignore contextual types applied by array binding patterns
4413+
SkipObjectBindingPatterns = 1 << 4, // Ignore contextual types applied by object binding patterns
4414+
SkipBindingPatterns = SkipArrayBindingPatterns | SkipObjectBindingPatterns,
44134415
}
44144416

44154417
// NOTE: If modifying this enum, must modify `TypeFormatFlags` too!

Diff for: tests/baselines/reference/destructuringTuple.errors.txt

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1+
tests/cases/compiler/destructuringTuple.ts(11,7): error TS2461: Type 'number' is not an array type.
2+
tests/cases/compiler/destructuringTuple.ts(11,48): error TS2769: No overload matches this call.
3+
Overload 1 of 3, '(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number, initialValue: number): number', gave the following error.
4+
Type 'never[]' is not assignable to type 'number'.
5+
Overload 2 of 3, '(callbackfn: (previousValue: [], currentValue: number, currentIndex: number, array: number[]) => [], initialValue: []): []', gave the following error.
6+
Type 'never[]' is not assignable to type '[]'.
7+
Target allows only 0 element(s) but source may have more.
18
tests/cases/compiler/destructuringTuple.ts(11,60): error TS2769: No overload matches this call.
29
Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
310
Argument of type 'number' is not assignable to parameter of type 'ConcatArray<never>'.
411
Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
512
Argument of type 'number' is not assignable to parameter of type 'ConcatArray<never>'.
613

714

8-
==== tests/cases/compiler/destructuringTuple.ts (1 errors) ====
15+
==== tests/cases/compiler/destructuringTuple.ts (3 errors) ====
916
declare var tuple: [boolean, number, ...string[]];
1017

1118
const [a, b, c, ...rest] = tuple;
@@ -17,6 +24,17 @@ tests/cases/compiler/destructuringTuple.ts(11,60): error TS2769: No overload mat
1724
// Repros from #32140
1825

1926
const [oops1] = [1, 2, 3].reduce((accu, el) => accu.concat(el), []);
27+
~~~~~~~
28+
!!! error TS2461: Type 'number' is not an array type.
29+
~~~~~~~~~~~~~~~
30+
!!! error TS2769: No overload matches this call.
31+
!!! error TS2769: Overload 1 of 3, '(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number, initialValue: number): number', gave the following error.
32+
!!! error TS2769: Type 'never[]' is not assignable to type 'number'.
33+
!!! error TS2769: Overload 2 of 3, '(callbackfn: (previousValue: [], currentValue: number, currentIndex: number, array: number[]) => [], initialValue: []): []', gave the following error.
34+
!!! error TS2769: Type 'never[]' is not assignable to type '[]'.
35+
!!! error TS2769: Target allows only 0 element(s) but source may have more.
36+
!!! related TS6502 /.ts/lib.es5.d.ts:1429:24: The expected type comes from the return type of this signature.
37+
!!! related TS6502 /.ts/lib.es5.d.ts:1435:27: The expected type comes from the return type of this signature.
2038
~~
2139
!!! error TS2769: No overload matches this call.
2240
!!! error TS2769: Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.

Diff for: tests/baselines/reference/destructuringTuple.types

+5-5
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,20 @@ declare var receiver: typeof tuple;
2323
// Repros from #32140
2424

2525
const [oops1] = [1, 2, 3].reduce((accu, el) => accu.concat(el), []);
26-
>oops1 : never
27-
>[1, 2, 3].reduce((accu, el) => accu.concat(el), []) : never[]
26+
>oops1 : any
27+
>[1, 2, 3].reduce((accu, el) => accu.concat(el), []) : number
2828
>[1, 2, 3].reduce : { (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number): number; (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number, initialValue: number): number; <U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: number[]) => U, initialValue: U): U; }
2929
>[1, 2, 3] : number[]
3030
>1 : 1
3131
>2 : 2
3232
>3 : 3
3333
>reduce : { (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number): number; (callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number, initialValue: number): number; <U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: number[]) => U, initialValue: U): U; }
34-
>(accu, el) => accu.concat(el) : (accu: never[], el: number) => never[]
35-
>accu : never[]
34+
>(accu, el) => accu.concat(el) : (accu: [], el: number) => never[]
35+
>accu : []
3636
>el : number
3737
>accu.concat(el) : never[]
3838
>accu.concat : { (...items: ConcatArray<never>[]): never[]; (...items: ConcatArray<never>[]): never[]; }
39-
>accu : never[]
39+
>accu : []
4040
>concat : { (...items: ConcatArray<never>[]): never[]; (...items: ConcatArray<never>[]): never[]; }
4141
>el : number
4242
>[] : never[]

Diff for: tests/baselines/reference/destructuringTuple2.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//// [destructuringTuple2.ts]
2+
declare const f: <T>(cb: () => T) => T;
3+
const [a, b, c] = f(() => [1, "hi", true]);
4+
5+
6+
//// [destructuringTuple2.js]
7+
var _a = f(function () { return [1, "hi", true]; }), a = _a[0], b = _a[1], c = _a[2];
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
=== tests/cases/compiler/destructuringTuple2.ts ===
2+
declare const f: <T>(cb: () => T) => T;
3+
>f : Symbol(f, Decl(destructuringTuple2.ts, 0, 13))
4+
>T : Symbol(T, Decl(destructuringTuple2.ts, 0, 18))
5+
>cb : Symbol(cb, Decl(destructuringTuple2.ts, 0, 21))
6+
>T : Symbol(T, Decl(destructuringTuple2.ts, 0, 18))
7+
>T : Symbol(T, Decl(destructuringTuple2.ts, 0, 18))
8+
9+
const [a, b, c] = f(() => [1, "hi", true]);
10+
>a : Symbol(a, Decl(destructuringTuple2.ts, 1, 7))
11+
>b : Symbol(b, Decl(destructuringTuple2.ts, 1, 9))
12+
>c : Symbol(c, Decl(destructuringTuple2.ts, 1, 12))
13+
>f : Symbol(f, Decl(destructuringTuple2.ts, 0, 13))
14+

Diff for: tests/baselines/reference/destructuringTuple2.types

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
=== tests/cases/compiler/destructuringTuple2.ts ===
2+
declare const f: <T>(cb: () => T) => T;
3+
>f : <T>(cb: () => T) => T
4+
>cb : () => T
5+
6+
const [a, b, c] = f(() => [1, "hi", true]);
7+
>a : number
8+
>b : string
9+
>c : boolean
10+
>f(() => [1, "hi", true]) : [number, string, boolean]
11+
>f : <T>(cb: () => T) => T
12+
>() => [1, "hi", true] : () => [number, string, boolean]
13+
>[1, "hi", true] : [number, string, true]
14+
>1 : 1
15+
>"hi" : "hi"
16+
>true : true
17+

Diff for: tests/cases/compiler/destructuringTuple2.ts

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
declare const f: <T>(cb: () => T) => T;
2+
const [a, b, c] = f(() => [1, "hi", true]);

0 commit comments

Comments
 (0)