Skip to content

Commit 04379d5

Browse files
authored
Lookup type arguments correcly for taged templates when checking generic arity (microsoft#24496)
1 parent 75f20f9 commit 04379d5

File tree

5 files changed

+93
-1
lines changed

5 files changed

+93
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17718,7 +17718,7 @@ namespace ts {
1771817718
// Even if the call is incomplete, we'll have a missing expression as our last argument,
1771917719
// so we can say the count is just the arg list length
1772017720
argCount = args.length;
17721-
typeArguments = undefined;
17721+
typeArguments = node.typeArguments;
1772217722

1772317723
if (node.template.kind === SyntaxKind.TemplateExpression) {
1772417724
// If a tagged template expression lacks a tail literal, the call is incomplete.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//// [genericTemplateOverloadResolution.ts]
2+
interface IFooFn {
3+
(strings: TemplateStringsArray): Promise<{}>;
4+
<T>(strings: TemplateStringsArray): Promise<T>;
5+
}
6+
7+
declare const fooFn: IFooFn;
8+
9+
declare function expect(x: Promise<number>): void;
10+
11+
expect(fooFn<number>``);
12+
13+
14+
//// [genericTemplateOverloadResolution.js]
15+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
16+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
17+
return cooked;
18+
};
19+
expect(fooFn(__makeTemplateObject([""], [""])));
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
=== tests/cases/compiler/genericTemplateOverloadResolution.ts ===
2+
interface IFooFn {
3+
>IFooFn : Symbol(IFooFn, Decl(genericTemplateOverloadResolution.ts, 0, 0))
4+
5+
(strings: TemplateStringsArray): Promise<{}>;
6+
>strings : Symbol(strings, Decl(genericTemplateOverloadResolution.ts, 1, 5))
7+
>TemplateStringsArray : Symbol(TemplateStringsArray, Decl(lib.d.ts, --, --))
8+
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --))
9+
10+
<T>(strings: TemplateStringsArray): Promise<T>;
11+
>T : Symbol(T, Decl(genericTemplateOverloadResolution.ts, 2, 5))
12+
>strings : Symbol(strings, Decl(genericTemplateOverloadResolution.ts, 2, 8))
13+
>TemplateStringsArray : Symbol(TemplateStringsArray, Decl(lib.d.ts, --, --))
14+
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --))
15+
>T : Symbol(T, Decl(genericTemplateOverloadResolution.ts, 2, 5))
16+
}
17+
18+
declare const fooFn: IFooFn;
19+
>fooFn : Symbol(fooFn, Decl(genericTemplateOverloadResolution.ts, 5, 13))
20+
>IFooFn : Symbol(IFooFn, Decl(genericTemplateOverloadResolution.ts, 0, 0))
21+
22+
declare function expect(x: Promise<number>): void;
23+
>expect : Symbol(expect, Decl(genericTemplateOverloadResolution.ts, 5, 28))
24+
>x : Symbol(x, Decl(genericTemplateOverloadResolution.ts, 7, 24))
25+
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --))
26+
27+
expect(fooFn<number>``);
28+
>expect : Symbol(expect, Decl(genericTemplateOverloadResolution.ts, 5, 28))
29+
>fooFn : Symbol(fooFn, Decl(genericTemplateOverloadResolution.ts, 5, 13))
30+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
=== tests/cases/compiler/genericTemplateOverloadResolution.ts ===
2+
interface IFooFn {
3+
>IFooFn : IFooFn
4+
5+
(strings: TemplateStringsArray): Promise<{}>;
6+
>strings : TemplateStringsArray
7+
>TemplateStringsArray : TemplateStringsArray
8+
>Promise : Promise<T>
9+
10+
<T>(strings: TemplateStringsArray): Promise<T>;
11+
>T : T
12+
>strings : TemplateStringsArray
13+
>TemplateStringsArray : TemplateStringsArray
14+
>Promise : Promise<T>
15+
>T : T
16+
}
17+
18+
declare const fooFn: IFooFn;
19+
>fooFn : IFooFn
20+
>IFooFn : IFooFn
21+
22+
declare function expect(x: Promise<number>): void;
23+
>expect : (x: Promise<number>) => void
24+
>x : Promise<number>
25+
>Promise : Promise<T>
26+
27+
expect(fooFn<number>``);
28+
>expect(fooFn<number>``) : void
29+
>expect : (x: Promise<number>) => void
30+
>fooFn<number>`` : Promise<number>
31+
>fooFn : IFooFn
32+
>`` : ""
33+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
interface IFooFn {
2+
(strings: TemplateStringsArray): Promise<{}>;
3+
<T>(strings: TemplateStringsArray): Promise<T>;
4+
}
5+
6+
declare const fooFn: IFooFn;
7+
8+
declare function expect(x: Promise<number>): void;
9+
10+
expect(fooFn<number>``);

0 commit comments

Comments
 (0)