diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 072ed10aa712e..587fa0dc0181b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13541,6 +13541,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (paramMapper) { result.mapper = left.compositeKind !== TypeFlags.Intersection && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper; } + else if (left.compositeKind !== TypeFlags.Intersection && left.mapper && left.compositeSignatures) { + result.mapper = left.mapper; + } return result; } diff --git a/tests/baselines/reference/unionCallMixedTypeParameterPresence.symbols b/tests/baselines/reference/unionCallMixedTypeParameterPresence.symbols new file mode 100644 index 0000000000000..22f49ee96d578 --- /dev/null +++ b/tests/baselines/reference/unionCallMixedTypeParameterPresence.symbols @@ -0,0 +1,45 @@ +//// [tests/cases/compiler/unionCallMixedTypeParameterPresence.ts] //// + +=== unionCallMixedTypeParameterPresence.ts === +// https://github.com/microsoft/TypeScript/issues/57356 + +interface Err { +>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0)) +>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 2, 14)) + + f(a: (err: T) => U): Err; +>f : Symbol(Err.f, Decl(unionCallMixedTypeParameterPresence.ts, 2, 18)) +>U : Symbol(U, Decl(unionCallMixedTypeParameterPresence.ts, 3, 4)) +>a : Symbol(a, Decl(unionCallMixedTypeParameterPresence.ts, 3, 7)) +>err : Symbol(err, Decl(unionCallMixedTypeParameterPresence.ts, 3, 11)) +>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 2, 14)) +>U : Symbol(U, Decl(unionCallMixedTypeParameterPresence.ts, 3, 4)) +>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0)) +>U : Symbol(U, Decl(unionCallMixedTypeParameterPresence.ts, 3, 4)) +} +interface Ok { +>Ok : Symbol(Ok, Decl(unionCallMixedTypeParameterPresence.ts, 4, 1)) +>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 5, 13)) + + f(a: (err: T) => unknown): Err; +>f : Symbol(Ok.f, Decl(unionCallMixedTypeParameterPresence.ts, 5, 17)) +>a : Symbol(a, Decl(unionCallMixedTypeParameterPresence.ts, 6, 4)) +>err : Symbol(err, Decl(unionCallMixedTypeParameterPresence.ts, 6, 8)) +>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 5, 13)) +>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0)) +>T : Symbol(T, Decl(unionCallMixedTypeParameterPresence.ts, 5, 13)) +} +declare const e: Err<0> | Err<1> | Ok<2>; +>e : Symbol(e, Decl(unionCallMixedTypeParameterPresence.ts, 8, 13)) +>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0)) +>Err : Symbol(Err, Decl(unionCallMixedTypeParameterPresence.ts, 0, 0)) +>Ok : Symbol(Ok, Decl(unionCallMixedTypeParameterPresence.ts, 4, 1)) + +const e2 = e.f((e) => e); +>e2 : Symbol(e2, Decl(unionCallMixedTypeParameterPresence.ts, 9, 5)) +>e.f : Symbol(f, Decl(unionCallMixedTypeParameterPresence.ts, 2, 18), Decl(unionCallMixedTypeParameterPresence.ts, 2, 18), Decl(unionCallMixedTypeParameterPresence.ts, 5, 17)) +>e : Symbol(e, Decl(unionCallMixedTypeParameterPresence.ts, 8, 13)) +>f : Symbol(f, Decl(unionCallMixedTypeParameterPresence.ts, 2, 18), Decl(unionCallMixedTypeParameterPresence.ts, 2, 18), Decl(unionCallMixedTypeParameterPresence.ts, 5, 17)) +>e : Symbol(e, Decl(unionCallMixedTypeParameterPresence.ts, 9, 16)) +>e : Symbol(e, Decl(unionCallMixedTypeParameterPresence.ts, 9, 16)) + diff --git a/tests/baselines/reference/unionCallMixedTypeParameterPresence.types b/tests/baselines/reference/unionCallMixedTypeParameterPresence.types new file mode 100644 index 0000000000000..fd22c8d9b1aa4 --- /dev/null +++ b/tests/baselines/reference/unionCallMixedTypeParameterPresence.types @@ -0,0 +1,30 @@ +//// [tests/cases/compiler/unionCallMixedTypeParameterPresence.ts] //// + +=== unionCallMixedTypeParameterPresence.ts === +// https://github.com/microsoft/TypeScript/issues/57356 + +interface Err { + f(a: (err: T) => U): Err; +>f : (a: (err: T) => U) => Err +>a : (err: T) => U +>err : T +} +interface Ok { + f(a: (err: T) => unknown): Err; +>f : (a: (err: T) => unknown) => Err +>a : (err: T) => unknown +>err : T +} +declare const e: Err<0> | Err<1> | Ok<2>; +>e : Err<0> | Err<1> | Ok<2> + +const e2 = e.f((e) => e); +>e2 : Err<2> | Err<0 | 1 | 2> +>e.f((e) => e) : Err<2> | Err<0 | 1 | 2> +>e.f : ((a: (err: 0) => U) => Err) | ((a: (err: 1) => U_1) => Err) | ((a: (err: 2) => unknown) => Err<2>) +>e : Err<0> | Err<1> | Ok<2> +>f : ((a: (err: 0) => U) => Err) | ((a: (err: 1) => U_1) => Err) | ((a: (err: 2) => unknown) => Err<2>) +>(e) => e : (e: 0 | 1 | 2) => 0 | 1 | 2 +>e : 0 | 1 | 2 +>e : 0 | 1 | 2 + diff --git a/tests/cases/compiler/unionCallMixedTypeParameterPresence.ts b/tests/cases/compiler/unionCallMixedTypeParameterPresence.ts new file mode 100644 index 0000000000000..c1699d010de00 --- /dev/null +++ b/tests/cases/compiler/unionCallMixedTypeParameterPresence.ts @@ -0,0 +1,13 @@ +// @strict: true +// @noEmit: true + +// https://github.com/microsoft/TypeScript/issues/57356 + +interface Err { + f(a: (err: T) => U): Err; +} +interface Ok { + f(a: (err: T) => unknown): Err; +} +declare const e: Err<0> | Err<1> | Ok<2>; +const e2 = e.f((e) => e);