diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8af1cc2e36d0a..799da26a1c049 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14888,8 +14888,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return getReturnTypeOfTypeTag(declaration); } - function isResolvingReturnTypeOfSignature(signature: Signature) { - return !signature.resolvedReturnType && findResolutionCycleStartIndex(signature, TypeSystemPropertyName.ResolvedReturnType) >= 0; + function isResolvingReturnTypeOfSignature(signature: Signature): boolean { + return signature.compositeSignatures && some(signature.compositeSignatures, isResolvingReturnTypeOfSignature) || + !signature.resolvedReturnType && findResolutionCycleStartIndex(signature, TypeSystemPropertyName.ResolvedReturnType) >= 0; } function getRestTypeOfSignature(signature: Signature): Type { diff --git a/tests/baselines/reference/compositeContextualSignature.symbols b/tests/baselines/reference/compositeContextualSignature.symbols new file mode 100644 index 0000000000000..60c30fd6ee908 --- /dev/null +++ b/tests/baselines/reference/compositeContextualSignature.symbols @@ -0,0 +1,33 @@ +//// [tests/cases/compiler/compositeContextualSignature.ts] //// + +=== compositeContextualSignature.ts === +// Repro from #55145 + +function f(v: ReadonlyArray) { } +>f : Symbol(f, Decl(compositeContextualSignature.ts, 0, 0)) +>T : Symbol(T, Decl(compositeContextualSignature.ts, 2, 11)) +>v : Symbol(v, Decl(compositeContextualSignature.ts, 2, 28)) +>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(compositeContextualSignature.ts, 2, 11)) + +f([ +>f : Symbol(f, Decl(compositeContextualSignature.ts, 0, 0)) + + [ + undefined, +>undefined : Symbol(undefined) + + () => { }, + ], + [ + 1, + () => { + console.log('Hello') +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) + + }, + ], +]); + diff --git a/tests/baselines/reference/compositeContextualSignature.types b/tests/baselines/reference/compositeContextualSignature.types new file mode 100644 index 0000000000000..2e389e2b360e6 --- /dev/null +++ b/tests/baselines/reference/compositeContextualSignature.types @@ -0,0 +1,44 @@ +//// [tests/cases/compiler/compositeContextualSignature.ts] //// + +=== compositeContextualSignature.ts === +// Repro from #55145 + +function f(v: ReadonlyArray) { } +>f : (v: ReadonlyArray) => void +>v : readonly T[] + +f([ +>f([ [ undefined, () => { }, ], [ 1, () => { console.log('Hello') }, ],]) : void +>f : (v: readonly T[]) => void +>[ [ undefined, () => { }, ], [ 1, () => { console.log('Hello') }, ],] : (((() => void) | undefined)[] | (number | (() => void))[])[] + + [ +>[ undefined, () => { }, ] : ((() => void) | undefined)[] + + undefined, +>undefined : undefined + + () => { }, +>() => { } : () => void + + ], + [ +>[ 1, () => { console.log('Hello') }, ] : (number | (() => void))[] + + 1, +>1 : 1 + + () => { +>() => { console.log('Hello') } : () => void + + console.log('Hello') +>console.log('Hello') : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>'Hello' : "Hello" + + }, + ], +]); + diff --git a/tests/cases/compiler/compositeContextualSignature.ts b/tests/cases/compiler/compositeContextualSignature.ts new file mode 100644 index 0000000000000..4f77c3c64265f --- /dev/null +++ b/tests/cases/compiler/compositeContextualSignature.ts @@ -0,0 +1,19 @@ +// @strict: true +// @noEmit: true + +// Repro from #55145 + +function f(v: ReadonlyArray) { } + +f([ + [ + undefined, + () => { }, + ], + [ + 1, + () => { + console.log('Hello') + }, + ], +]);