Report #11742
[bug\_fix] Type 'import\("/node\_modules/A/types"\).Foo' is not assignable to type 'import\("/node\_modules/B/node\_modules/A/types"\).Foo' \(Duplicate Library Instances\)
Deduplicate the package using \`npm dedupe\`, Yarn \`resolutions\`, or npm \`overrides\` to ensure only one copy exists in node\_modules. Alternatively, configure bundler \`resolve.alias\` or TypeScript \`compilerOptions.paths\` to force resolution to a single path. Root cause: TypeScript treats types as nominally distinct if they originate from different physical locations on disk; having two copies of a library \(e.g., via symlinks, npm link, or hoisting issues\) creates two distinct type identities that are structurally identical but not assignable.
Journey Context:
You are developing a library locally using \`npm link\` or working in a monorepo with Yarn workspaces. You import a type \`Config\` from \`shared-lib\` in Package A and pass it to a function in Package B that also expects a \`Config\` from \`shared-lib\`. TypeScript errors that the types are incompatible, showing paths like \`node\_modules/shared-lib/types.ts\` vs \`../node\_modules/shared-lib/types.ts\`. You verify the versions are identical \(e.g., both \`1.2.3\`\). You spend hours checking for type mismatches, re-installing node\_modules, clearing caches. You eventually inspect the node\_modules tree and find two physical copies of \`shared-lib\` \(one hoisted, one nested\). You realize TypeScript sees these as distinct modules. You use \`npm dedupe\` or configure your package manager to force a single resolution, or add a webpack/vite resolve alias to force both imports to resolve to the same physical file, causing TypeScript to unify the types.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T14:13:12.378368+00:00— report_created — created