Declaration emit reveals paths within dependency that were not referred to in the source file
See original GitHub issueContext:
- Generating declaration files
Declaration emit reveals paths within dependency that were not referred to in the source file:
export declare const instance: import("dependency/internal-types").TheInterface;
This is a problem because changing paths within a dependency can break a dependent package.
TypeScript Version: 3.9.0-dev.20200212
Search Terms:
Code
node_modules/@types/dependency/entrypoint.d.ts
import { TheInterface } from "./internal-types";
export { TheInterface };
export declare function getInstance(): TheInterface;
node_modules/@types/dependency/internal-types.d.ts
export interface TheInterface {}
node_modules/@types/dependency/index.d.ts
// empty - doesn't matter for this example
example.ts
import { getInstance } from "dependency/entrypoint";
export const instance = getInstance();
src/app/tsconfig.json
{
"compilerOptions": {
"declaration": true,
}
}
Expected behavior:
example.d.ts
export declare const instance: import("dependency/entrypoint").TheInterface;
Actual behavior:
example.d.ts
export declare const instance: import("dependency/internal-types").TheInterface;
It seems that part of the solution could involve having the compiler avoid using relative paths in types (import("<relativepath>").<typename>
) if the relativepath
is outside the project.
Repro Repo: https://github.com/mheiber/repro-rel-import-inlining
Related Issues:
- Declaration emit should not inline type definitions - #37151
- Proposal: Bundling TS module type definitions - #4433
Issue written with the help of: @rricard, @robpalme and @mkubilayk
Issue Analytics
- State:
- Created 3 years ago
- Reactions:4
- Comments:10 (4 by maintainers)
Top GitHub Comments
This has gotten worse with the introduction of
"moduleResolution": "node16"
. Paths are now rewritten to relative paths insidenode_modules
. (import('mdast-util-from-markdown')
yieldsimport("../../../node_modules/mdast-util-from-markdown/lib/index.js")
)https://github.com/remarkjs/remark/issues/1039#issuecomment-1239253894
When writing up that issue we also found out a pretty interesting effect.
If you were to move the
internal-types.d.ts
into a sub-directory in the dependency and have entrypoint load it:node_modules/@types/dependency/entrypoint.d.ts
We do get the wanted declaration output:
example.d.ts
This is great because that means that TypeScript has a notion of some files are meant to be imported and others do not.
At the moment it seems like everything in the root of the dependency is considered importable externally while subdirectories are not.Actually the rule seems to be, whoever is the least deep gets it:checker.ts:5014
#27340 / 7a71887c23a110009bc974f626245f03066e6926 by @weswigham
Is that behavior intentional, in which case we can use it as a workaround, or is this arbitrary behavior that can change?