Skip to content

Commit 20ebe1e

Browse files
authored
Merge pull request #26244 from Microsoft/fixThisAndContextualTypes
Revise logic that computes the contextual type for a parameter
2 parents a36a53b + 9d71023 commit 20ebe1e

File tree

2 files changed

+64
-14
lines changed

2 files changed

+64
-14
lines changed

src/compiler/checker.ts

+4-14
Original file line numberDiff line numberDiff line change
@@ -15827,20 +15827,10 @@ namespace ts {
1582715827
}
1582815828
const contextualSignature = getContextualSignature(func);
1582915829
if (contextualSignature) {
15830-
const funcHasRestParameter = hasRestParameter(func);
15831-
const len = func.parameters.length - (funcHasRestParameter ? 1 : 0);
15832-
let indexOfParameter = func.parameters.indexOf(parameter);
15833-
if (getThisParameter(func) !== undefined && !contextualSignature.thisParameter) {
15834-
Debug.assert(indexOfParameter !== 0); // Otherwise we should not have called `getContextuallyTypedParameterType`.
15835-
indexOfParameter -= 1;
15836-
}
15837-
if (indexOfParameter < len) {
15838-
return getTypeAtPosition(contextualSignature, indexOfParameter);
15839-
}
15840-
// If last parameter is contextually rest parameter get its type
15841-
if (funcHasRestParameter && indexOfParameter === len) {
15842-
return getRestTypeAtPosition(contextualSignature, indexOfParameter);
15843-
}
15830+
const index = func.parameters.indexOf(parameter) - (getThisParameter(func) ? 1 : 0);
15831+
return parameter.dotDotDotToken && lastOrUndefined(func.parameters) === parameter ?
15832+
getRestTypeAtPosition(contextualSignature, index) :
15833+
tryGetTypeAtPosition(contextualSignature, index);
1584415834
}
1584515835
}
1584615836

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////declare function foo(cb: (this: any, x: number, y: string, z: boolean) => void): void;
4+
////
5+
////foo(function(this, a, ...args) {
6+
//// a/*10*/;
7+
//// args/*11*/;
8+
////});
9+
////
10+
////foo(function(this, a, b, ...args) {
11+
//// a/*20*/;
12+
//// b/*21*/;
13+
//// args/*22*/;
14+
////});
15+
////
16+
////foo(function(this, a, b, c, ...args) {
17+
//// a/*30*/;
18+
//// b/*31*/;
19+
//// c/*32*/;
20+
//// args/*33*/;
21+
////});
22+
////
23+
////foo(function(a, ...args) {
24+
//// a/*40*/;
25+
//// args/*41*/;
26+
////});
27+
////
28+
////foo(function(a, b, ...args) {
29+
//// a/*50*/;
30+
//// b/*51*/;
31+
//// args/*52*/;
32+
////});
33+
////
34+
////foo(function(a, b, c, ...args) {
35+
//// a/*60*/;
36+
//// b/*61*/;
37+
//// c/*62*/;
38+
//// args/*63*/;
39+
////});
40+
41+
verify.quickInfos({
42+
10: "(parameter) a: number",
43+
11: "(parameter) args: [string, boolean]",
44+
20: "(parameter) a: number",
45+
21: "(parameter) b: string",
46+
22: "(parameter) args: [boolean]",
47+
30: "(parameter) a: number",
48+
31: "(parameter) b: string",
49+
32: "(parameter) c: boolean",
50+
33: "(parameter) args: []",
51+
40: "(parameter) a: number",
52+
41: "(parameter) args: [string, boolean]",
53+
50: "(parameter) a: number",
54+
51: "(parameter) b: string",
55+
52: "(parameter) args: [boolean]",
56+
60: "(parameter) a: number",
57+
61: "(parameter) b: string",
58+
62: "(parameter) c: boolean",
59+
63: "(parameter) args: []",
60+
});

0 commit comments

Comments
 (0)