diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 54339bbdf3f..83d2130174f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21103,6 +21103,12 @@ namespace ts { return getTypeOfSymbol(symbol); } if (symbol.flags & (SymbolFlags.Variable | SymbolFlags.Property)) { + if (getCheckFlags(symbol) & CheckFlags.Mapped) { + const origin = (symbol).syntheticOrigin; + if (origin && getExplicitTypeOfSymbol(origin)) { + return getTypeOfSymbol(symbol); + } + } const declaration = symbol.valueDeclaration; if (declaration) { if (isDeclarationWithExplicitTypeAnnotation(declaration)) { diff --git a/tests/baselines/reference/neverReturningFunctions1.errors.txt b/tests/baselines/reference/neverReturningFunctions1.errors.txt index f84395e501c..de3c6a0c53b 100644 --- a/tests/baselines/reference/neverReturningFunctions1.errors.txt +++ b/tests/baselines/reference/neverReturningFunctions1.errors.txt @@ -318,4 +318,18 @@ tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(153,5): error TS this.throw() } } + + // Repro from #40346 + + interface Services { + panic(message: string): never; + } + + function foo(services: Readonly, s: string | null): string { + if (s === null) { + services.panic("ouch"); + } else { + return s; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/neverReturningFunctions1.js b/tests/baselines/reference/neverReturningFunctions1.js index 35be732c3ec..84b356873a6 100644 --- a/tests/baselines/reference/neverReturningFunctions1.js +++ b/tests/baselines/reference/neverReturningFunctions1.js @@ -247,6 +247,20 @@ class SuperThrowable extends MyThrowable { this.throw() } } + +// Repro from #40346 + +interface Services { + panic(message: string): never; +} + +function foo(services: Readonly, s: string | null): string { + if (s === null) { + services.panic("ouch"); + } else { + return s; + } +} //// [neverReturningFunctions1.js] @@ -467,6 +481,14 @@ var SuperThrowable = /** @class */ (function (_super) { }; return SuperThrowable; }(MyThrowable)); +function foo(services, s) { + if (s === null) { + services.panic("ouch"); + } + else { + return s; + } +} //// [neverReturningFunctions1.d.ts] diff --git a/tests/baselines/reference/neverReturningFunctions1.symbols b/tests/baselines/reference/neverReturningFunctions1.symbols index 3ecda28aee1..b91c8fdb4b0 100644 --- a/tests/baselines/reference/neverReturningFunctions1.symbols +++ b/tests/baselines/reference/neverReturningFunctions1.symbols @@ -635,3 +635,34 @@ class SuperThrowable extends MyThrowable { } } +// Repro from #40346 + +interface Services { +>Services : Symbol(Services, Decl(neverReturningFunctions1.ts, 247, 1)) + + panic(message: string): never; +>panic : Symbol(Services.panic, Decl(neverReturningFunctions1.ts, 251, 20)) +>message : Symbol(message, Decl(neverReturningFunctions1.ts, 252, 10)) +} + +function foo(services: Readonly, s: string | null): string { +>foo : Symbol(foo, Decl(neverReturningFunctions1.ts, 253, 1)) +>services : Symbol(services, Decl(neverReturningFunctions1.ts, 255, 13)) +>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --)) +>Services : Symbol(Services, Decl(neverReturningFunctions1.ts, 247, 1)) +>s : Symbol(s, Decl(neverReturningFunctions1.ts, 255, 42)) + + if (s === null) { +>s : Symbol(s, Decl(neverReturningFunctions1.ts, 255, 42)) + + services.panic("ouch"); +>services.panic : Symbol(panic, Decl(neverReturningFunctions1.ts, 251, 20)) +>services : Symbol(services, Decl(neverReturningFunctions1.ts, 255, 13)) +>panic : Symbol(panic, Decl(neverReturningFunctions1.ts, 251, 20)) + + } else { + return s; +>s : Symbol(s, Decl(neverReturningFunctions1.ts, 255, 42)) + } +} + diff --git a/tests/baselines/reference/neverReturningFunctions1.types b/tests/baselines/reference/neverReturningFunctions1.types index 2111736b893..c832fa660dd 100644 --- a/tests/baselines/reference/neverReturningFunctions1.types +++ b/tests/baselines/reference/neverReturningFunctions1.types @@ -706,3 +706,35 @@ class SuperThrowable extends MyThrowable { } } +// Repro from #40346 + +interface Services { + panic(message: string): never; +>panic : (message: string) => never +>message : string +} + +function foo(services: Readonly, s: string | null): string { +>foo : (services: Readonly, s: string | null) => string +>services : Readonly +>s : string | null +>null : null + + if (s === null) { +>s === null : boolean +>s : string | null +>null : null + + services.panic("ouch"); +>services.panic("ouch") : never +>services.panic : (message: string) => never +>services : Readonly +>panic : (message: string) => never +>"ouch" : "ouch" + + } else { + return s; +>s : string + } +} + diff --git a/tests/cases/conformance/controlFlow/neverReturningFunctions1.ts b/tests/cases/conformance/controlFlow/neverReturningFunctions1.ts index c2b553d21b3..de034e803f2 100644 --- a/tests/cases/conformance/controlFlow/neverReturningFunctions1.ts +++ b/tests/cases/conformance/controlFlow/neverReturningFunctions1.ts @@ -250,3 +250,17 @@ class SuperThrowable extends MyThrowable { this.throw() } } + +// Repro from #40346 + +interface Services { + panic(message: string): never; +} + +function foo(services: Readonly, s: string | null): string { + if (s === null) { + services.panic("ouch"); + } else { + return s; + } +}