Skip to content

Commit a4f0d66

Browse files
committed
Fixed type parameter leak in union calls with mixed type parameter presence
1 parent 25a708c commit a4f0d66

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

src/compiler/checker.ts

+3
Original file line numberDiff line numberDiff line change
@@ -13541,6 +13541,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1354113541
if (paramMapper) {
1354213542
result.mapper = left.compositeKind !== TypeFlags.Intersection && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper;
1354313543
}
13544+
else if (left.compositeKind !== TypeFlags.Intersection && left.mapper && left.compositeSignatures) {
13545+
result.mapper = left.mapper;
13546+
}
1354413547
return result;
1354513548
}
1354613549

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//// [tests/cases/compiler/unionCallMixedTypeParameterPresence.ts] ////
2+
3+
=== unionCallMixedTypeParameterPresence.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/57356
5+
6+
interface Err<T> {
7+
>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0))
8+
>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 2, 14))
9+
10+
f<U>(a: (err: T) => U): Err<U>;
11+
>f : Symbol(Err.f, Decl(unionCallMixedTypeParameterPresence.ts, 2, 18))
12+
>U : Symbol(U, Decl(unionCallMixedTypeParameterPresence.ts, 3, 4))
13+
>a : Symbol(a, Decl(unionCallMixedTypeParameterPresence.ts, 3, 7))
14+
>err : Symbol(err, Decl(unionCallMixedTypeParameterPresence.ts, 3, 11))
15+
>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 2, 14))
16+
>U : Symbol(U, Decl(unionCallMixedTypeParameterPresence.ts, 3, 4))
17+
>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0))
18+
>U : Symbol(U, Decl(unionCallMixedTypeParameterPresence.ts, 3, 4))
19+
}
20+
interface Ok<T> {
21+
>Ok : Symbol(Ok, Decl(unionCallMixedTypeParameterPresence.ts, 4, 1))
22+
>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 5, 13))
23+
24+
f(a: (err: T) => unknown): Err<T>;
25+
>f : Symbol(Ok.f, Decl(unionCallMixedTypeParameterPresence.ts, 5, 17))
26+
>a : Symbol(a, Decl(unionCallMixedTypeParameterPresence.ts, 6, 4))
27+
>err : Symbol(err, Decl(unionCallMixedTypeParameterPresence.ts, 6, 8))
28+
>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 5, 13))
29+
>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0))
30+
>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 5, 13))
31+
}
32+
declare const e: Err<0> | Err<1> | Ok<2>;
33+
>e : Symbol(e, Decl(unionCallMixedTypeParameterPresence.ts, 8, 13))
34+
>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0))
35+
>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0))
36+
>Ok : Symbol(Ok, Decl(unionCallMixedTypeParameterPresence.ts, 4, 1))
37+
38+
const e2 = e.f((e) => e);
39+
>e2 : Symbol(e2, Decl(unionCallMixedTypeParameterPresence.ts, 9, 5))
40+
>e.f : Symbol(f, Decl(unionCallMixedTypeParameterPresence.ts, 2, 18), Decl(unionCallMixedTypeParameterPresence.ts, 2, 18), Decl(unionCallMixedTypeParameterPresence.ts, 5, 17))
41+
>e : Symbol(e, Decl(unionCallMixedTypeParameterPresence.ts, 8, 13))
42+
>f : Symbol(f, Decl(unionCallMixedTypeParameterPresence.ts, 2, 18), Decl(unionCallMixedTypeParameterPresence.ts, 2, 18), Decl(unionCallMixedTypeParameterPresence.ts, 5, 17))
43+
>e : Symbol(e, Decl(unionCallMixedTypeParameterPresence.ts, 9, 16))
44+
>e : Symbol(e, Decl(unionCallMixedTypeParameterPresence.ts, 9, 16))
45+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//// [tests/cases/compiler/unionCallMixedTypeParameterPresence.ts] ////
2+
3+
=== unionCallMixedTypeParameterPresence.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/57356
5+
6+
interface Err<T> {
7+
f<U>(a: (err: T) => U): Err<U>;
8+
>f : <U>(a: (err: T) => U) => Err<U>
9+
>a : (err: T) => U
10+
>err : T
11+
}
12+
interface Ok<T> {
13+
f(a: (err: T) => unknown): Err<T>;
14+
>f : (a: (err: T) => unknown) => Err<T>
15+
>a : (err: T) => unknown
16+
>err : T
17+
}
18+
declare const e: Err<0> | Err<1> | Ok<2>;
19+
>e : Err<0> | Err<1> | Ok<2>
20+
21+
const e2 = e.f((e) => e);
22+
>e2 : Err<2> | Err<0 | 1 | 2>
23+
>e.f((e) => e) : Err<2> | Err<0 | 1 | 2>
24+
>e.f : (<U>(a: (err: 0) => U) => Err<U>) | (<U_1>(a: (err: 1) => U_1) => Err<U_1>) | ((a: (err: 2) => unknown) => Err<2>)
25+
>e : Err<0> | Err<1> | Ok<2>
26+
>f : (<U>(a: (err: 0) => U) => Err<U>) | (<U_1>(a: (err: 1) => U_1) => Err<U_1>) | ((a: (err: 2) => unknown) => Err<2>)
27+
>(e) => e : (e: 0 | 1 | 2) => 0 | 1 | 2
28+
>e : 0 | 1 | 2
29+
>e : 0 | 1 | 2
30+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
// https://github.com/microsoft/TypeScript/issues/57356
5+
6+
interface Err<T> {
7+
f<U>(a: (err: T) => U): Err<U>;
8+
}
9+
interface Ok<T> {
10+
f(a: (err: T) => unknown): Err<T>;
11+
}
12+
declare const e: Err<0> | Err<1> | Ok<2>;
13+
const e2 = e.f((e) => e);

0 commit comments

Comments
 (0)