diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9ed6f52c38c71..c835d81482365 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5665,6 +5665,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (getSymbolIfSameReference(exported, symbol)) { return exported; } + if (symbol.flags & SymbolFlags.TypeAlias) { + const aliasSymbol = getDeclaredTypeOfTypeAlias(exported).aliasSymbol; + if (aliasSymbol && getSymbolIfSameReference(aliasSymbol, symbol)) { + return exported; + } + } }); } diff --git a/tests/baselines/reference/declarationEmitUsingTypeAlias1.js b/tests/baselines/reference/declarationEmitUsingTypeAlias1.js new file mode 100644 index 0000000000000..9bfe2999627b9 --- /dev/null +++ b/tests/baselines/reference/declarationEmitUsingTypeAlias1.js @@ -0,0 +1,47 @@ +//// [tests/cases/compiler/declarationEmitUsingTypeAlias1.ts] //// + +//// [inner.d.ts] +export declare type Other = { other: string }; +export declare type SomeType = { arg: Other }; + +//// [index.d.ts] +export type OtherType = import('./inner').Other; +export type SomeType = import('./inner').SomeType; + +//// [package.json] +{ + "name": "some-dep", + "exports": { + ".": "./dist/index.js" + } +} + +//// [index.ts] +import { SomeType } from "some-dep"; + +export const foo = (thing: SomeType) => { + return thing; +}; + +export const bar = (thing: SomeType) => { + return thing.arg; +}; + +//// [index.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.bar = exports.foo = void 0; +var foo = function (thing) { + return thing; +}; +exports.foo = foo; +var bar = function (thing) { + return thing.arg; +}; +exports.bar = bar; + + +//// [index.d.ts] +import { SomeType } from "some-dep"; +export declare const foo: (thing: SomeType) => import("some-dep").SomeType; +export declare const bar: (thing: SomeType) => import("some-dep").OtherType; diff --git a/tests/baselines/reference/declarationEmitUsingTypeAlias1.symbols b/tests/baselines/reference/declarationEmitUsingTypeAlias1.symbols new file mode 100644 index 0000000000000..55573f5c9aff2 --- /dev/null +++ b/tests/baselines/reference/declarationEmitUsingTypeAlias1.symbols @@ -0,0 +1,46 @@ +//// [tests/cases/compiler/declarationEmitUsingTypeAlias1.ts] //// + +=== node_modules/some-dep/dist/inner.d.ts === +export declare type Other = { other: string }; +>Other : Symbol(Other, Decl(inner.d.ts, 0, 0)) +>other : Symbol(other, Decl(inner.d.ts, 0, 29)) + +export declare type SomeType = { arg: Other }; +>SomeType : Symbol(SomeType, Decl(inner.d.ts, 0, 46)) +>arg : Symbol(arg, Decl(inner.d.ts, 1, 32)) +>Other : Symbol(Other, Decl(inner.d.ts, 0, 0)) + +=== node_modules/some-dep/dist/index.d.ts === +export type OtherType = import('./inner').Other; +>OtherType : Symbol(OtherType, Decl(index.d.ts, 0, 0)) +>Other : Symbol(Other, Decl(inner.d.ts, 0, 0)) + +export type SomeType = import('./inner').SomeType; +>SomeType : Symbol(SomeType, Decl(index.d.ts, 0, 48)) +>SomeType : Symbol(SomeType, Decl(inner.d.ts, 0, 46)) + +=== src/index.ts === +import { SomeType } from "some-dep"; +>SomeType : Symbol(SomeType, Decl(index.ts, 0, 8)) + +export const foo = (thing: SomeType) => { +>foo : Symbol(foo, Decl(index.ts, 2, 12)) +>thing : Symbol(thing, Decl(index.ts, 2, 20)) +>SomeType : Symbol(SomeType, Decl(index.ts, 0, 8)) + + return thing; +>thing : Symbol(thing, Decl(index.ts, 2, 20)) + +}; + +export const bar = (thing: SomeType) => { +>bar : Symbol(bar, Decl(index.ts, 6, 12)) +>thing : Symbol(thing, Decl(index.ts, 6, 20)) +>SomeType : Symbol(SomeType, Decl(index.ts, 0, 8)) + + return thing.arg; +>thing.arg : Symbol(arg, Decl(inner.d.ts, 1, 32)) +>thing : Symbol(thing, Decl(index.ts, 6, 20)) +>arg : Symbol(arg, Decl(inner.d.ts, 1, 32)) + +}; diff --git a/tests/baselines/reference/declarationEmitUsingTypeAlias1.types b/tests/baselines/reference/declarationEmitUsingTypeAlias1.types new file mode 100644 index 0000000000000..f32f9775eea30 --- /dev/null +++ b/tests/baselines/reference/declarationEmitUsingTypeAlias1.types @@ -0,0 +1,43 @@ +//// [tests/cases/compiler/declarationEmitUsingTypeAlias1.ts] //// + +=== node_modules/some-dep/dist/inner.d.ts === +export declare type Other = { other: string }; +>Other : { other: string; } +>other : string + +export declare type SomeType = { arg: Other }; +>SomeType : { arg: Other; } +>arg : Other + +=== node_modules/some-dep/dist/index.d.ts === +export type OtherType = import('./inner').Other; +>OtherType : import("node_modules/some-dep/dist/inner").Other + +export type SomeType = import('./inner').SomeType; +>SomeType : import("node_modules/some-dep/dist/inner").SomeType + +=== src/index.ts === +import { SomeType } from "some-dep"; +>SomeType : any + +export const foo = (thing: SomeType) => { +>foo : (thing: SomeType) => import("node_modules/some-dep/dist/inner").SomeType +>(thing: SomeType) => { return thing;} : (thing: SomeType) => import("node_modules/some-dep/dist/inner").SomeType +>thing : import("node_modules/some-dep/dist/inner").SomeType + + return thing; +>thing : import("node_modules/some-dep/dist/inner").SomeType + +}; + +export const bar = (thing: SomeType) => { +>bar : (thing: SomeType) => import("node_modules/some-dep/dist/inner").Other +>(thing: SomeType) => { return thing.arg;} : (thing: SomeType) => import("node_modules/some-dep/dist/inner").Other +>thing : import("node_modules/some-dep/dist/inner").SomeType + + return thing.arg; +>thing.arg : import("node_modules/some-dep/dist/inner").Other +>thing : import("node_modules/some-dep/dist/inner").SomeType +>arg : import("node_modules/some-dep/dist/inner").Other + +}; diff --git a/tests/cases/compiler/declarationEmitUsingTypeAlias1.ts b/tests/cases/compiler/declarationEmitUsingTypeAlias1.ts new file mode 100644 index 0000000000000..257a82e3e32bc --- /dev/null +++ b/tests/cases/compiler/declarationEmitUsingTypeAlias1.ts @@ -0,0 +1,30 @@ +// @strict: true +// @declaration: true +// @module: nodenext + +// @filename: node_modules/some-dep/dist/inner.d.ts +export declare type Other = { other: string }; +export declare type SomeType = { arg: Other }; + +// @filename: node_modules/some-dep/dist/index.d.ts +export type OtherType = import('./inner').Other; +export type SomeType = import('./inner').SomeType; + +// @filename: node_modules/some-dep/package.json +{ + "name": "some-dep", + "exports": { + ".": "./dist/index.js" + } +} + +// @filename: src/index.ts +import { SomeType } from "some-dep"; + +export const foo = (thing: SomeType) => { + return thing; +}; + +export const bar = (thing: SomeType) => { + return thing.arg; +}; \ No newline at end of file