diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index cc4a0f4e34d..2ec99d2fa2b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1370,6 +1370,9 @@ namespace ts { // An 'import { Point } from "graphics"' needs to create a symbol that combines the value side 'Point' // property with the type/namespace side interface 'Point'. function combineValueAndTypeSymbols(valueSymbol: Symbol, typeSymbol: Symbol): Symbol { + if (valueSymbol === unknownSymbol && typeSymbol === unknownSymbol) { + return unknownSymbol; + } if (valueSymbol.flags & (SymbolFlags.Type | SymbolFlags.Namespace)) { return valueSymbol; } diff --git a/tests/baselines/reference/reexportedMissingAlias.errors.txt b/tests/baselines/reference/reexportedMissingAlias.errors.txt new file mode 100644 index 00000000000..c22bf2da9d0 --- /dev/null +++ b/tests/baselines/reference/reexportedMissingAlias.errors.txt @@ -0,0 +1,18 @@ +tests/cases/compiler/second.d.ts(2,27): error TS2304: Cannot find name 'CompletelyMissing'. +tests/cases/compiler/second.d.ts(2,27): error TS2503: Cannot find namespace 'CompletelyMissing'. + + +==== tests/cases/compiler/second.d.ts (2 errors) ==== + // Fixes #15094 + export import Component = CompletelyMissing; + ~~~~~~~~~~~~~~~~~ +!!! error TS2304: Cannot find name 'CompletelyMissing'. + ~~~~~~~~~~~~~~~~~ +!!! error TS2503: Cannot find namespace 'CompletelyMissing'. +==== tests/cases/compiler/first.d.ts (0 errors) ==== + import * as Second from './second'; + export = Second; +==== tests/cases/compiler/crash.ts (0 errors) ==== + import { Component } from './first'; + class C extends Component { } + \ No newline at end of file diff --git a/tests/baselines/reference/reexportedMissingAlias.js b/tests/baselines/reference/reexportedMissingAlias.js new file mode 100644 index 00000000000..792ea3eb5c2 --- /dev/null +++ b/tests/baselines/reference/reexportedMissingAlias.js @@ -0,0 +1,34 @@ +//// [tests/cases/compiler/reexportedMissingAlias.ts] //// + +//// [second.d.ts] +// Fixes #15094 +export import Component = CompletelyMissing; +//// [first.d.ts] +import * as Second from './second'; +export = Second; +//// [crash.ts] +import { Component } from './first'; +class C extends Component { } + + +//// [crash.js] +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +exports.__esModule = true; +var first_1 = require("./first"); +var C = (function (_super) { + __extends(C, _super); + function C() { + return _super !== null && _super.apply(this, arguments) || this; + } + return C; +}(first_1.Component)); diff --git a/tests/cases/compiler/reexportedMissingAlias.ts b/tests/cases/compiler/reexportedMissingAlias.ts new file mode 100644 index 00000000000..b430cd526c8 --- /dev/null +++ b/tests/cases/compiler/reexportedMissingAlias.ts @@ -0,0 +1,9 @@ +// Fixes #15094 +// @Filename: second.d.ts +export import Component = CompletelyMissing; +// @Filename: first.d.ts +import * as Second from './second'; +export = Second; +// @Filename: crash.ts +import { Component } from './first'; +class C extends Component { }