Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 9da2a9a

Browse files
authoredJan 11, 2023
Fix inferences between alias type arguments and defaulted alias type arguments (#51771)
1 parent 6860373 commit 9da2a9a

5 files changed

+364
-3
lines changed
 

‎src/compiler/checker.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20871,7 +20871,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2087120871
if (variances === emptyArray) {
2087220872
return Ternary.Unknown;
2087320873
}
20874-
const varianceResult = relateVariances(source.aliasTypeArguments, target.aliasTypeArguments, variances, intersectionState);
20874+
const params = getSymbolLinks(source.aliasSymbol).typeParameters!;
20875+
const minParams = getMinTypeArgumentCount(params);
20876+
const sourceTypes = fillMissingTypeArguments(source.aliasTypeArguments, params, minParams, isInJSFile(source.aliasSymbol.valueDeclaration));
20877+
const targetTypes = fillMissingTypeArguments(target.aliasTypeArguments, params, minParams, isInJSFile(source.aliasSymbol.valueDeclaration));
20878+
const varianceResult = relateVariances(sourceTypes, targetTypes, variances, intersectionState);
2087520879
if (varianceResult !== undefined) {
2087620880
return varianceResult;
2087720881
}
@@ -23805,8 +23809,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2380523809
if (source.aliasSymbol && source.aliasSymbol === target.aliasSymbol) {
2380623810
if (source.aliasTypeArguments) {
2380723811
// Source and target are types originating in the same generic type alias declaration.
23808-
// Simply infer from source type arguments to target type arguments.
23809-
inferFromTypeArguments(source.aliasTypeArguments, target.aliasTypeArguments!, getAliasVariances(source.aliasSymbol));
23812+
// Simply infer from source type arguments to target type arguments, with defaults applied.
23813+
const params = getSymbolLinks(source.aliasSymbol).typeParameters!;
23814+
const minParams = getMinTypeArgumentCount(params);
23815+
const sourceTypes = fillMissingTypeArguments(source.aliasTypeArguments, params, minParams, isInJSFile(source.aliasSymbol.valueDeclaration));
23816+
const targetTypes = fillMissingTypeArguments(target.aliasTypeArguments, params, minParams, isInJSFile(source.aliasSymbol.valueDeclaration));
23817+
inferFromTypeArguments(sourceTypes, targetTypes!, getAliasVariances(source.aliasSymbol));
2381023818
}
2381123819
// And if there weren't any type arguments, there's no reason to run inference as the types must be the same.
2381223820
return;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//// [tests/cases/compiler/importedAliasedConditionalTypeInstantiation.ts] ////
2+
3+
//// [index.d.ts]
4+
export type Handler<TEvent = any, TResult = any> = (
5+
event: TEvent,
6+
context: {},
7+
callback: Callback<TResult>,
8+
) => void | Promise<TResult>;
9+
10+
export type Callback<TResult = any> = (error?: Error | string | null, result?: TResult) => void;
11+
12+
//// [index.d.ts]
13+
import { Handler, Callback } from 'aws-lambda';
14+
declare namespace lambdaTester {
15+
type HandlerEvent<T extends Handler> = T extends Handler<infer TEvent> ? TEvent : never;
16+
type HandlerResult<T extends Handler> = T extends Handler<any, infer TResult> ? TResult : never;
17+
type HandlerError<T extends Handler> = T extends Handler<any, infer TResult>
18+
? NonNullable<Parameters<Callback<TResult>>['0']>
19+
: never;
20+
21+
interface VerifierFn<S> {
22+
(result: S, additional?: any): void | Promise<void>;
23+
(result: S, additional?: any, done?: () => {}): void;
24+
}
25+
type Verifier<S> = S extends HandlerError<Handler>
26+
? S extends string
27+
? VerifierFn<string>
28+
: S extends Error
29+
? VerifierFn<Error>
30+
: never
31+
: VerifierFn<S>;
32+
33+
class LambdaTester<T extends Handler> {
34+
event(event: HandlerEvent<T>): this;
35+
}
36+
}
37+
38+
declare function lambdaTester<T extends Handler>(handler: T): lambdaTester.LambdaTester<T>;
39+
40+
export = lambdaTester;
41+
//// [index.ts]
42+
import * as lambdaTester from 'lambda-tester';
43+
import { Handler } from 'aws-lambda';
44+
45+
type Actual = lambdaTester.Verifier<lambdaTester.HandlerResult<Handler>>;
46+
type Expected = lambdaTester.Verifier<lambdaTester.HandlerResult<Handler<any, any>>>;
47+
48+
//// [index.js]
49+
"use strict";
50+
exports.__esModule = true;
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
=== tests/cases/compiler/node_modules/aws-lambda/index.d.ts ===
2+
export type Handler<TEvent = any, TResult = any> = (
3+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 0))
4+
>TEvent : Symbol(TEvent, Decl(index.d.ts, 0, 20))
5+
>TResult : Symbol(TResult, Decl(index.d.ts, 0, 33))
6+
7+
event: TEvent,
8+
>event : Symbol(event, Decl(index.d.ts, 0, 52))
9+
>TEvent : Symbol(TEvent, Decl(index.d.ts, 0, 20))
10+
11+
context: {},
12+
>context : Symbol(context, Decl(index.d.ts, 1, 18))
13+
14+
callback: Callback<TResult>,
15+
>callback : Symbol(callback, Decl(index.d.ts, 2, 16))
16+
>Callback : Symbol(Callback, Decl(index.d.ts, 4, 29))
17+
>TResult : Symbol(TResult, Decl(index.d.ts, 0, 33))
18+
19+
) => void | Promise<TResult>;
20+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --))
21+
>TResult : Symbol(TResult, Decl(index.d.ts, 0, 33))
22+
23+
export type Callback<TResult = any> = (error?: Error | string | null, result?: TResult) => void;
24+
>Callback : Symbol(Callback, Decl(index.d.ts, 4, 29))
25+
>TResult : Symbol(TResult, Decl(index.d.ts, 6, 21))
26+
>error : Symbol(error, Decl(index.d.ts, 6, 39))
27+
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
28+
>result : Symbol(result, Decl(index.d.ts, 6, 69))
29+
>TResult : Symbol(TResult, Decl(index.d.ts, 6, 21))
30+
31+
=== tests/cases/compiler/node_modules/lambda-tester/index.d.ts ===
32+
import { Handler, Callback } from 'aws-lambda';
33+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
34+
>Callback : Symbol(Callback, Decl(index.d.ts, 0, 17))
35+
36+
declare namespace lambdaTester {
37+
>lambdaTester : Symbol(lambdaTester, Decl(index.d.ts, 23, 1), Decl(index.d.ts, 0, 47))
38+
39+
type HandlerEvent<T extends Handler> = T extends Handler<infer TEvent> ? TEvent : never;
40+
>HandlerEvent : Symbol(HandlerEvent, Decl(index.d.ts, 1, 32))
41+
>T : Symbol(T, Decl(index.d.ts, 2, 22))
42+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
43+
>T : Symbol(T, Decl(index.d.ts, 2, 22))
44+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
45+
>TEvent : Symbol(TEvent, Decl(index.d.ts, 2, 66))
46+
>TEvent : Symbol(TEvent, Decl(index.d.ts, 2, 66))
47+
48+
type HandlerResult<T extends Handler> = T extends Handler<any, infer TResult> ? TResult : never;
49+
>HandlerResult : Symbol(HandlerResult, Decl(index.d.ts, 2, 92))
50+
>T : Symbol(T, Decl(index.d.ts, 3, 23))
51+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
52+
>T : Symbol(T, Decl(index.d.ts, 3, 23))
53+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
54+
>TResult : Symbol(TResult, Decl(index.d.ts, 3, 72))
55+
>TResult : Symbol(TResult, Decl(index.d.ts, 3, 72))
56+
57+
type HandlerError<T extends Handler> = T extends Handler<any, infer TResult>
58+
>HandlerError : Symbol(HandlerError, Decl(index.d.ts, 3, 100))
59+
>T : Symbol(T, Decl(index.d.ts, 4, 22))
60+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
61+
>T : Symbol(T, Decl(index.d.ts, 4, 22))
62+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
63+
>TResult : Symbol(TResult, Decl(index.d.ts, 4, 71))
64+
65+
? NonNullable<Parameters<Callback<TResult>>['0']>
66+
>NonNullable : Symbol(NonNullable, Decl(lib.es5.d.ts, --, --))
67+
>Parameters : Symbol(Parameters, Decl(lib.es5.d.ts, --, --))
68+
>Callback : Symbol(Callback, Decl(index.d.ts, 0, 17))
69+
>TResult : Symbol(TResult, Decl(index.d.ts, 4, 71))
70+
71+
: never;
72+
73+
interface VerifierFn<S> {
74+
>VerifierFn : Symbol(VerifierFn, Decl(index.d.ts, 6, 16))
75+
>S : Symbol(S, Decl(index.d.ts, 8, 25))
76+
77+
(result: S, additional?: any): void | Promise<void>;
78+
>result : Symbol(result, Decl(index.d.ts, 9, 9))
79+
>S : Symbol(S, Decl(index.d.ts, 8, 25))
80+
>additional : Symbol(additional, Decl(index.d.ts, 9, 19))
81+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --))
82+
83+
(result: S, additional?: any, done?: () => {}): void;
84+
>result : Symbol(result, Decl(index.d.ts, 10, 9))
85+
>S : Symbol(S, Decl(index.d.ts, 8, 25))
86+
>additional : Symbol(additional, Decl(index.d.ts, 10, 19))
87+
>done : Symbol(done, Decl(index.d.ts, 10, 37))
88+
}
89+
type Verifier<S> = S extends HandlerError<Handler>
90+
>Verifier : Symbol(Verifier, Decl(index.d.ts, 11, 5))
91+
>S : Symbol(S, Decl(index.d.ts, 12, 18))
92+
>S : Symbol(S, Decl(index.d.ts, 12, 18))
93+
>HandlerError : Symbol(HandlerError, Decl(index.d.ts, 3, 100))
94+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
95+
96+
? S extends string
97+
>S : Symbol(S, Decl(index.d.ts, 12, 18))
98+
99+
? VerifierFn<string>
100+
>VerifierFn : Symbol(VerifierFn, Decl(index.d.ts, 6, 16))
101+
102+
: S extends Error
103+
>S : Symbol(S, Decl(index.d.ts, 12, 18))
104+
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
105+
106+
? VerifierFn<Error>
107+
>VerifierFn : Symbol(VerifierFn, Decl(index.d.ts, 6, 16))
108+
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
109+
110+
: never
111+
: VerifierFn<S>;
112+
>VerifierFn : Symbol(VerifierFn, Decl(index.d.ts, 6, 16))
113+
>S : Symbol(S, Decl(index.d.ts, 12, 18))
114+
115+
class LambdaTester<T extends Handler> {
116+
>LambdaTester : Symbol(LambdaTester, Decl(index.d.ts, 18, 24))
117+
>T : Symbol(T, Decl(index.d.ts, 20, 23))
118+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
119+
120+
event(event: HandlerEvent<T>): this;
121+
>event : Symbol(LambdaTester.event, Decl(index.d.ts, 20, 43))
122+
>event : Symbol(event, Decl(index.d.ts, 21, 14))
123+
>HandlerEvent : Symbol(HandlerEvent, Decl(index.d.ts, 1, 32))
124+
>T : Symbol(T, Decl(index.d.ts, 20, 23))
125+
}
126+
}
127+
128+
declare function lambdaTester<T extends Handler>(handler: T): lambdaTester.LambdaTester<T>;
129+
>lambdaTester : Symbol(lambdaTester, Decl(index.d.ts, 23, 1), Decl(index.d.ts, 0, 47))
130+
>T : Symbol(T, Decl(index.d.ts, 25, 30))
131+
>Handler : Symbol(Handler, Decl(index.d.ts, 0, 8))
132+
>handler : Symbol(handler, Decl(index.d.ts, 25, 49))
133+
>T : Symbol(T, Decl(index.d.ts, 25, 30))
134+
>lambdaTester : Symbol(lambdaTester, Decl(index.d.ts, 23, 1), Decl(index.d.ts, 0, 47))
135+
>LambdaTester : Symbol(lambdaTester.LambdaTester, Decl(index.d.ts, 18, 24))
136+
>T : Symbol(T, Decl(index.d.ts, 25, 30))
137+
138+
export = lambdaTester;
139+
>lambdaTester : Symbol(lambdaTester, Decl(index.d.ts, 23, 1), Decl(index.d.ts, 0, 47))
140+
141+
=== tests/cases/compiler/index.ts ===
142+
import * as lambdaTester from 'lambda-tester';
143+
>lambdaTester : Symbol(lambdaTester, Decl(index.ts, 0, 6))
144+
145+
import { Handler } from 'aws-lambda';
146+
>Handler : Symbol(Handler, Decl(index.ts, 1, 8))
147+
148+
type Actual = lambdaTester.Verifier<lambdaTester.HandlerResult<Handler>>;
149+
>Actual : Symbol(Actual, Decl(index.ts, 1, 37))
150+
>lambdaTester : Symbol(lambdaTester, Decl(index.ts, 0, 6))
151+
>Verifier : Symbol(lambdaTester.Verifier, Decl(index.d.ts, 11, 5))
152+
>lambdaTester : Symbol(lambdaTester, Decl(index.ts, 0, 6))
153+
>HandlerResult : Symbol(lambdaTester.HandlerResult, Decl(index.d.ts, 2, 92))
154+
>Handler : Symbol(Handler, Decl(index.ts, 1, 8))
155+
156+
type Expected = lambdaTester.Verifier<lambdaTester.HandlerResult<Handler<any, any>>>;
157+
>Expected : Symbol(Expected, Decl(index.ts, 3, 73))
158+
>lambdaTester : Symbol(lambdaTester, Decl(index.ts, 0, 6))
159+
>Verifier : Symbol(lambdaTester.Verifier, Decl(index.d.ts, 11, 5))
160+
>lambdaTester : Symbol(lambdaTester, Decl(index.ts, 0, 6))
161+
>HandlerResult : Symbol(lambdaTester.HandlerResult, Decl(index.d.ts, 2, 92))
162+
>Handler : Symbol(Handler, Decl(index.ts, 1, 8))
163+
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
=== tests/cases/compiler/node_modules/aws-lambda/index.d.ts ===
2+
export type Handler<TEvent = any, TResult = any> = (
3+
>Handler : Handler<TEvent, TResult>
4+
5+
event: TEvent,
6+
>event : TEvent
7+
8+
context: {},
9+
>context : {}
10+
11+
callback: Callback<TResult>,
12+
>callback : Callback<TResult>
13+
14+
) => void | Promise<TResult>;
15+
16+
export type Callback<TResult = any> = (error?: Error | string | null, result?: TResult) => void;
17+
>Callback : Callback<TResult>
18+
>error : string | Error
19+
>null : null
20+
>result : TResult
21+
22+
=== tests/cases/compiler/node_modules/lambda-tester/index.d.ts ===
23+
import { Handler, Callback } from 'aws-lambda';
24+
>Handler : any
25+
>Callback : any
26+
27+
declare namespace lambdaTester {
28+
>lambdaTester : typeof lambdaTester
29+
30+
type HandlerEvent<T extends Handler> = T extends Handler<infer TEvent> ? TEvent : never;
31+
>HandlerEvent : HandlerEvent<T>
32+
33+
type HandlerResult<T extends Handler> = T extends Handler<any, infer TResult> ? TResult : never;
34+
>HandlerResult : HandlerResult<T>
35+
36+
type HandlerError<T extends Handler> = T extends Handler<any, infer TResult>
37+
>HandlerError : HandlerError<T>
38+
39+
? NonNullable<Parameters<Callback<TResult>>['0']>
40+
: never;
41+
42+
interface VerifierFn<S> {
43+
(result: S, additional?: any): void | Promise<void>;
44+
>result : S
45+
>additional : any
46+
47+
(result: S, additional?: any, done?: () => {}): void;
48+
>result : S
49+
>additional : any
50+
>done : () => {}
51+
}
52+
type Verifier<S> = S extends HandlerError<Handler>
53+
>Verifier : Verifier<S>
54+
55+
? S extends string
56+
? VerifierFn<string>
57+
: S extends Error
58+
? VerifierFn<Error>
59+
: never
60+
: VerifierFn<S>;
61+
62+
class LambdaTester<T extends Handler> {
63+
>LambdaTester : LambdaTester<T>
64+
65+
event(event: HandlerEvent<T>): this;
66+
>event : (event: HandlerEvent<T>) => this
67+
>event : HandlerEvent<T>
68+
}
69+
}
70+
71+
declare function lambdaTester<T extends Handler>(handler: T): lambdaTester.LambdaTester<T>;
72+
>lambdaTester : typeof lambdaTester
73+
>handler : T
74+
>lambdaTester : any
75+
76+
export = lambdaTester;
77+
>lambdaTester : typeof lambdaTester
78+
79+
=== tests/cases/compiler/index.ts ===
80+
import * as lambdaTester from 'lambda-tester';
81+
>lambdaTester : typeof lambdaTester
82+
83+
import { Handler } from 'aws-lambda';
84+
>Handler : any
85+
86+
type Actual = lambdaTester.Verifier<lambdaTester.HandlerResult<Handler>>;
87+
>Actual : lambdaTester.VerifierFn<string> | lambdaTester.VerifierFn<Error> | lambdaTester.VerifierFn<any>
88+
>lambdaTester : any
89+
>lambdaTester : any
90+
91+
type Expected = lambdaTester.Verifier<lambdaTester.HandlerResult<Handler<any, any>>>;
92+
>Expected : lambdaTester.VerifierFn<string> | lambdaTester.VerifierFn<Error> | lambdaTester.VerifierFn<any>
93+
>lambdaTester : any
94+
>lambdaTester : any
95+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// @filename: node_modules/aws-lambda/index.d.ts
2+
export type Handler<TEvent = any, TResult = any> = (
3+
event: TEvent,
4+
context: {},
5+
callback: Callback<TResult>,
6+
) => void | Promise<TResult>;
7+
8+
export type Callback<TResult = any> = (error?: Error | string | null, result?: TResult) => void;
9+
10+
// @filename: node_modules/lambda-tester/index.d.ts
11+
import { Handler, Callback } from 'aws-lambda';
12+
declare namespace lambdaTester {
13+
type HandlerEvent<T extends Handler> = T extends Handler<infer TEvent> ? TEvent : never;
14+
type HandlerResult<T extends Handler> = T extends Handler<any, infer TResult> ? TResult : never;
15+
type HandlerError<T extends Handler> = T extends Handler<any, infer TResult>
16+
? NonNullable<Parameters<Callback<TResult>>['0']>
17+
: never;
18+
19+
interface VerifierFn<S> {
20+
(result: S, additional?: any): void | Promise<void>;
21+
(result: S, additional?: any, done?: () => {}): void;
22+
}
23+
type Verifier<S> = S extends HandlerError<Handler>
24+
? S extends string
25+
? VerifierFn<string>
26+
: S extends Error
27+
? VerifierFn<Error>
28+
: never
29+
: VerifierFn<S>;
30+
31+
class LambdaTester<T extends Handler> {
32+
event(event: HandlerEvent<T>): this;
33+
}
34+
}
35+
36+
declare function lambdaTester<T extends Handler>(handler: T): lambdaTester.LambdaTester<T>;
37+
38+
export = lambdaTester;
39+
// @filename: index.ts
40+
41+
import * as lambdaTester from 'lambda-tester';
42+
import { Handler } from 'aws-lambda';
43+
44+
type Actual = lambdaTester.Verifier<lambdaTester.HandlerResult<Handler>>;
45+
type Expected = lambdaTester.Verifier<lambdaTester.HandlerResult<Handler<any, any>>>;

0 commit comments

Comments
 (0)
Please sign in to comment.