Skip to content

Commit dd2fc86

Browse files
authored
Don’t give all instantiated signatures in JS strict arity (microsoft#39606)
1 parent ef9affe commit dd2fc86

File tree

4 files changed

+161
-1
lines changed

4 files changed

+161
-1
lines changed

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5350,7 +5350,7 @@ namespace ts {
53505350
// We do not propagate `IsInnerCallChain` to instantiated signatures, as that would result in us
53515351
// attempting to add `| undefined` on each recursive call to `getReturnTypeOfSignature` when
53525352
// instantiating the return type.
5353-
PropagatingFlags = HasRestParameter | HasLiteralTypes,
5353+
PropagatingFlags = HasRestParameter | HasLiteralTypes | IsUntypedSignatureInJSFile,
53545354

53555355
CallChainFlags = IsInnerCallChain | IsOuterCallChain,
53565356
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
=== tests/cases/conformance/salsa/test.js ===
2+
function f(x) {}
3+
>f : Symbol(f, Decl(test.js, 0, 0))
4+
>x : Symbol(x, Decl(test.js, 0, 11))
5+
6+
f(); // Always been ok
7+
>f : Symbol(f, Decl(test.js, 0, 0))
8+
9+
class C {
10+
>C : Symbol(C, Decl(test.js, 1, 4))
11+
12+
static m(x) {}
13+
>m : Symbol(C.m, Decl(test.js, 3, 9))
14+
>x : Symbol(x, Decl(test.js, 4, 11))
15+
16+
p = x => {}
17+
>p : Symbol(C.p, Decl(test.js, 4, 16))
18+
>x : Symbol(x, Decl(test.js, 5, 5))
19+
20+
m(x) {}
21+
>m : Symbol(C.m, Decl(test.js, 5, 13))
22+
>x : Symbol(x, Decl(test.js, 6, 4))
23+
}
24+
25+
C.m(); // Always been ok
26+
>C.m : Symbol(C.m, Decl(test.js, 3, 9))
27+
>C : Symbol(C, Decl(test.js, 1, 4))
28+
>m : Symbol(C.m, Decl(test.js, 3, 9))
29+
30+
new C().m(); // Regression #39261
31+
>new C().m : Symbol(C.m, Decl(test.js, 5, 13))
32+
>C : Symbol(C, Decl(test.js, 1, 4))
33+
>m : Symbol(C.m, Decl(test.js, 5, 13))
34+
35+
new C().p(); // Regression #39261
36+
>new C().p : Symbol(C.p, Decl(test.js, 4, 16))
37+
>C : Symbol(C, Decl(test.js, 1, 4))
38+
>p : Symbol(C.p, Decl(test.js, 4, 16))
39+
40+
const obj = {
41+
>obj : Symbol(obj, Decl(test.js, 13, 5))
42+
43+
m(x) {},
44+
>m : Symbol(m, Decl(test.js, 13, 13))
45+
>x : Symbol(x, Decl(test.js, 14, 4))
46+
47+
p: x => {}
48+
>p : Symbol(p, Decl(test.js, 14, 10))
49+
>x : Symbol(x, Decl(test.js, 15, 4))
50+
51+
};
52+
53+
obj.m(); // Always been ok
54+
>obj.m : Symbol(m, Decl(test.js, 13, 13))
55+
>obj : Symbol(obj, Decl(test.js, 13, 5))
56+
>m : Symbol(m, Decl(test.js, 13, 13))
57+
58+
obj.p(); // Always been ok
59+
>obj.p : Symbol(p, Decl(test.js, 14, 10))
60+
>obj : Symbol(obj, Decl(test.js, 13, 5))
61+
>p : Symbol(p, Decl(test.js, 14, 10))
62+
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
=== tests/cases/conformance/salsa/test.js ===
2+
function f(x) {}
3+
>f : (x: any) => void
4+
>x : any
5+
6+
f(); // Always been ok
7+
>f() : void
8+
>f : (x: any) => void
9+
10+
class C {
11+
>C : C
12+
13+
static m(x) {}
14+
>m : (x: any) => void
15+
>x : any
16+
17+
p = x => {}
18+
>p : (x: any) => void
19+
>x => {} : (x: any) => void
20+
>x : any
21+
22+
m(x) {}
23+
>m : (x: any) => void
24+
>x : any
25+
}
26+
27+
C.m(); // Always been ok
28+
>C.m() : void
29+
>C.m : (x: any) => void
30+
>C : typeof C
31+
>m : (x: any) => void
32+
33+
new C().m(); // Regression #39261
34+
>new C().m() : void
35+
>new C().m : (x: any) => void
36+
>new C() : C
37+
>C : typeof C
38+
>m : (x: any) => void
39+
40+
new C().p(); // Regression #39261
41+
>new C().p() : void
42+
>new C().p : (x: any) => void
43+
>new C() : C
44+
>C : typeof C
45+
>p : (x: any) => void
46+
47+
const obj = {
48+
>obj : { m(x: any): void; p: (x: any) => void; }
49+
>{ m(x) {}, p: x => {}} : { m(x: any): void; p: (x: any) => void; }
50+
51+
m(x) {},
52+
>m : (x: any) => void
53+
>x : any
54+
55+
p: x => {}
56+
>p : (x: any) => void
57+
>x => {} : (x: any) => void
58+
>x : any
59+
60+
};
61+
62+
obj.m(); // Always been ok
63+
>obj.m() : void
64+
>obj.m : (x: any) => void
65+
>obj : { m(x: any): void; p: (x: any) => void; }
66+
>m : (x: any) => void
67+
68+
obj.p(); // Always been ok
69+
>obj.p() : void
70+
>obj.p : (x: any) => void
71+
>obj : { m(x: any): void; p: (x: any) => void; }
72+
>p : (x: any) => void
73+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @noEmit: true
4+
// @Filename: test.js
5+
6+
function f(x) {}
7+
f(); // Always been ok
8+
9+
class C {
10+
static m(x) {}
11+
p = x => {}
12+
m(x) {}
13+
}
14+
15+
C.m(); // Always been ok
16+
new C().m(); // Regression #39261
17+
new C().p(); // Regression #39261
18+
19+
const obj = {
20+
m(x) {},
21+
p: x => {}
22+
};
23+
24+
obj.m(); // Always been ok
25+
obj.p(); // Always been ok

0 commit comments

Comments
 (0)