diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ef428f26de9..8fef558968e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -12771,7 +12771,10 @@ namespace ts { if (!contextualSignature) { reportErrorsFromWidening(func, type); } - if (isUnitType(type) && !(contextualSignature && isLiteralContextualType(getReturnTypeOfSignature(contextualSignature)))) { + if (isUnitType(type) && + !(contextualSignature && + isLiteralContextualType( + contextualSignature === getSignatureFromDeclaration(func) ? type : getReturnTypeOfSignature(contextualSignature)))) { type = getWidenedLiteralType(type); } diff --git a/tests/baselines/reference/selfReference.js b/tests/baselines/reference/selfReference.js new file mode 100644 index 00000000000..2bb8ce9d9d0 --- /dev/null +++ b/tests/baselines/reference/selfReference.js @@ -0,0 +1,6 @@ +//// [selfReference.ts] +declare function asFunction(value: T): () => T; +asFunction(() => { return 1; }); + +//// [selfReference.js] +asFunction(function () { return 1; }); diff --git a/tests/baselines/reference/selfReference.symbols b/tests/baselines/reference/selfReference.symbols new file mode 100644 index 00000000000..dc618eaae17 --- /dev/null +++ b/tests/baselines/reference/selfReference.symbols @@ -0,0 +1,11 @@ +=== tests/cases/compiler/selfReference.ts === +declare function asFunction(value: T): () => T; +>asFunction : Symbol(asFunction, Decl(selfReference.ts, 0, 0)) +>T : Symbol(T, Decl(selfReference.ts, 0, 28)) +>value : Symbol(value, Decl(selfReference.ts, 0, 31)) +>T : Symbol(T, Decl(selfReference.ts, 0, 28)) +>T : Symbol(T, Decl(selfReference.ts, 0, 28)) + +asFunction(() => { return 1; }); +>asFunction : Symbol(asFunction, Decl(selfReference.ts, 0, 0)) + diff --git a/tests/baselines/reference/selfReference.types b/tests/baselines/reference/selfReference.types new file mode 100644 index 00000000000..eed1da72387 --- /dev/null +++ b/tests/baselines/reference/selfReference.types @@ -0,0 +1,14 @@ +=== tests/cases/compiler/selfReference.ts === +declare function asFunction(value: T): () => T; +>asFunction : (value: T) => () => T +>T : T +>value : T +>T : T +>T : T + +asFunction(() => { return 1; }); +>asFunction(() => { return 1; }) : () => () => 1 +>asFunction : (value: T) => () => T +>() => { return 1; } : () => 1 +>1 : 1 + diff --git a/tests/cases/compiler/selfReference.ts b/tests/cases/compiler/selfReference.ts new file mode 100644 index 00000000000..708acc42e02 --- /dev/null +++ b/tests/cases/compiler/selfReference.ts @@ -0,0 +1,3 @@ +// @noImplicitAny: true +declare function asFunction(value: T): () => T; +asFunction(() => { return 1; }); \ No newline at end of file