Skip to content

Package dependencies and The inferred type of ... cannot be named without a reference to ... #29808

Description

@AnyhowStep

TypeScript Version: 3.3.0-dev.20190119

Search Terms: inferred type, cannot be named, reference, package, dependency

This isn't really a traditional bug report. Mostly a PSA of some sort.

Code

The dependencies of interest are,

  • My project has a direct dependency to "A"
  • My project has a direct dependency to "B"
  • "A" has a direct dependency to "B"

Before updating,

  • My project has 1.0.0 of package "A" (older version)
  • My project has 2.51.1 of package "B" (older version)
  • 1.0.0 of package "A" has 2.51.1 of package "B" (older version)

After updating package "A",

  • My project has 1.0.1 of package "A" (newer patch version, bug-fix, no .d.ts changes)
  • My project has 2.51.1 of package "B" (older version)
  • 1.0.1 of package "A" has 2.51.2 of package "B" (newer patch version, bug-fix, no .d.ts changes)

There's a package version mismatch here.
My project has 2.51.1 of "B" but the package I updated has 2.51.2 of "B".


In the newer version of "A" and "B", no .d.ts files were added/removed/modified.


Expected

Before updating, the project compiled.
So, the rationale is that after updating a patch version, the project should still compile.

Actual

After updating, the project stopped compiling.

tsc crashed; out-of-memory exception.

VS Code gave me the error,

The inferred type of ... cannot be named without a reference to node_modules/A/node_modules/B


Workaround

The workaround is to just update "B" to 2.51.2 in my project. After doing so, everything compiles again.

It seems like package versions matter to TypeScript when it comes to transitive dependencies. Even if it's a patch version and no .d.ts files are added/removed/modified.

Related Issues: #29221

Activity

  1. RyanCavanaugh commented on Feb 14, 2019

    @RyanCavanaugh
    Member

    It'd be great to have a concrete way to repro the OOM exception

  2. simonfox commented on Apr 30, 2019

    @simonfox

    Ryan Cavanaugh (@RyanCavanaugh) we are bumping into this issue in an Aurelia app we are building.

    It has appeared after upgrade from TS 3.1.x (now on 3.4.5).

    For us the problem is exposed with declaration:true when we yarn link different packages together for dev.

    I've been trying to put together a repro for you and have got something although it's not perfect (problem is only visible via VS Code and I havent been able to determine the difference in the CLI build).

    If you clone https://github.com/simonfox/repro-plugin-one and https://github.com/simonfox/repro-plugin-two and run yarn for both. And then in plugin-one run yarn link plugin-two. Then you will see the issue in src/features/feature-one/actions.ts (you may need to reload the VS Code window after linking).

    image

  3. simonfox commented on Apr 30, 2019

    @simonfox

    Oh and probably importantly considering this seems to be exposed via symlinks, I am on Windows 10

  4. igorpupkinable commented on May 7, 2019

    @igorpupkinable

    Same here on Windows 10 x64 Pro.
    I have created directory junction with D:\>mklink /j p D:\projects.
    It works in D:\projects, but does fail in D:\p.

  5. antl3x commented on Aug 16, 2019

    @antl3x

    Simon Fox (@simonfox) you found any workaround?

  6. simonfox commented on Aug 16, 2019

    @simonfox

    @nthypes no sorry

  7. whimzyLive commented on Sep 26, 2019

    @whimzyLive

    Getting same error here 😩 after upgrading to 3.6.3 from 2.9.1

  8. AnyhowStep commented on Sep 26, 2019

    @AnyhowStep
    ContributorAuthor

    Sorry, guys, I never did create a minimal repro for this.

    But if you are getting assignability errors, it may have to do with classes with private properties, or unique symbols, which are nominally typed, and may not be assignable across different package versions.

    Even if they're structurally typed, if the interface or type alias is different between the two versions, they won't be assignable to each other (which makes sense, in this case)

    I still need to go ahead and make a repro for the assignability thing but I'm on holiday at the moment =x

    Not sure if I can repro the OOM anymore, though

  9. antoniopresto commented on Oct 10, 2019

    @antoniopresto

    solved with Module resolution:

    {
      "compilerOptions": {
        "baseUrl": ".", // This must be specified if "paths" is.
        "paths": {
          "graphql-compose": ["node_modules/graphql-compose/"]
        },
       // ...
    }
  10. akash-rajput commented on Nov 22, 2019

    @akash-rajput

    Happens when we have conflicting versions of a package installed. A temporary solution would be to remove the package mentioned from peer dependencies of the plugin giving the error.

    Or install the exact version of common dependancy

  11. al6x commented on Dec 3, 2019

    @al6x

    Same bug TS 3.7.2. The APP uses some REACT stuff imported indirectly (APP has no direct REACT dependency) via intermediary LIB.

    TypeScript complains some REACT interface passed indirectly through LIB cannot be named without a reference to LIB/node_modules/REACT.

    Temporary solution: set declaration: false in tsconfig.json in APP.

    P.S. Dependency structure

    APP
      has dependency to LIB (npm link)
      does not has REACT dependency and does not uses REACT stuff directly, but
      imports some react stuff from LIB.
    
    LIB in TS compiled to JS and D.TS
      has dependency to REACT (normal node_modules way)
      exposes some React stuff
    
  12. jeffrson commented on Feb 4, 2020

    @jeffrson

    Well, this is similar, though not related to package versions. Instead it seems to happen when actually referenced packages are located outside of the project folder.

    Here's a repro for Typescript 3.7.5 / 3.8.0-dev.20200204
    https://github.com/jeffrson/pnmp_vs_yarn_typescript

    It works for npm and yarn, but fails with pnpm and yarnv2. Disable creation of declarations "fixes" it somewhat, as well as appending the type:
    export const test: Router
    in index.ts.

  13. josenogueira-7egend commented on Feb 4, 2020

    @josenogueira-7egend

    Hello, I had the same issue!

    As a POC, I created a repository dedicated to this issue, to show how it is happening!
    Repository: https://github.com/nogueira7egend/ts-symlink-error/

    Screenshot Error:
    Captura de ecrã 2020-02-04, às 17 45 45

    Please check it and follow the instructions that are on README!
    Best regards

  14. 9 remaining items

  15. karlismelderis commented on May 5, 2021

    @karlismelderis

    In our case we used yarn workspaces and there were two packages with same dependency.
    difference was that in one case package had dependency with version ^1.2.3 and second had "*"
    and that * got added when version less than ^1.2.3 existed

    I'm not able to replicate exact steps here but eventually yarn was installing version that's below ^1.2.3 and this error helped to catch the issue.

  16. elbakerino commented on Sep 19, 2021

    @elbakerino

    Got also a similiar error at a lerna monorepo, using only npm (no yarn workspaces).

    The actual issue was that i've had @types/react installed only in one package, but used the typings in multiple packages, thus with lerna hoist it only was existing in /packages/node_modules/packageB and not in /node_modules.

    After adding it to the other depending packages, e.g. in devDependencies and as optional peer-dependency, the error was solved.

    Example of the additions in e.g. packageA:

    {
        "devDependencies": {
            "@types/react": "^16.8.6 || ^17.0.0"
        },
        "dependencies": {
        },
        "peerDependencies": {
            "@types/react": "^16.8.6 || ^17.0.0"
        },
        "peerDependenciesMeta": {
            "@types/react": {
                "optional": true
            }
        },
        "publishConfig": {
            "access": "public"
        }
    }
  17. vonkanehoffen commented on Oct 11, 2021

    @vonkanehoffen

    I also have a problem like this inside a monorepo, and just reinstalling the deps with yarn solves it. It's happened a few times. Don't know it could be something to do with the yarn.lock file getting out of sync after merging branches or something. The regenerated lock filed always shows a diff around the package referenced in the TS error.

    Don't really understand what's going on but hope that helps someone.

  18. roblatprogen commented on Dec 13, 2021

    @roblatprogen

    I got a similar error in a yarn workspace package project that: ... cannot be named without a reference to 'react-bootstrap/node_modules/@types/react'.

    Solved by moving "@types/react": "*" from peerDependencies section to devDependencies in package.json

  19. MoSwilam commented on Jan 7, 2022

    @MoSwilam

    I restarted the damn IDE and it disappeared :/

  20. daniele-orlando commented on Jan 11, 2022

    @daniele-orlando

    Try with:

    {
      "compilerOptions": {
        "preserveSymlinks": true
      }
    }

    Credits to Cong Yu (@imcuttle)
    #42873 (comment)

  21. vtereshyn commented on May 10, 2022

    @vtereshyn

    "preserveSymlinks": true doesn't resolve all errors that I have. I also use pnpm and typescript together. Previously I used yarn and typescript and everything was fine.
    Now, I have The inferred type of 'configSchema' cannot be named without a reference to '@pnpm-test/core-config/node_modules/yup/lib/string'. This is likely not portable. A type annotation is necessary. and have no idea how to resolve that.

    I also set declaration: false for testing purposes but had no luck having it working.

  22. givebk-bot commented on May 14, 2022

    @givebk-bot

    Hey! Looks like someone invited me to this issue.

  23. antl3x commented on May 14, 2022

    @antl3x

    givebk bot (@givebk-bot) !donate Antonio Silva (@antoniopresto) $ 5

    thanks for your solution! old but gold. ❤️

  24. givebk-bot commented on May 14, 2022

    @givebk-bot
  25. zhaohuanyuu commented on May 26, 2022

    @zhaohuanyuu

    Try with:

    {
      "compilerOptions": {
        "preserveSymlinks": true
      }
    }

    Credits to Cong Yu (@imcuttle) #42873 (comment)

    It does work for link errors using pnpm. thank you very much.

  26. unional commented on Nov 18, 2022

    @unional
    Contributor

    The "preserveSymlinks": true fix this but break others.
    When it is turned on, TypeScript cannot resolve transient types.

    e.g. @types/react-router-dom uses react-router. But TS cannot resolve it as react-router is not add as a direct dependency, so it resides in <rootDir>/node_modules/.pnpm/....

  27. RyanCavanaugh commented on Nov 19, 2022

    @RyanCavanaugh
    Member

    Closing this for clarity since I'd prefer new issues to misconfiguration questions and banal observations of issue age.

    To recap, you get this error when the declaration emitter can't synthesize a legal-looking import path for a file it needs create an explicit import for in order to name a type that was indirectly referenced. It's another way of saying "You can't get there from here".

    The declaration emitter is not 100% perfect and it may be possible for a human to write a path that actually is legal in these situations.

    If you get this error, generally the best thing to do is to write an import in the erroring file to the module that the declaration emitter is trying to reference. If you can't do this because there's no legal way to do it in your program, then, well, there's your problem -- you're asking tsc to do something impossible.

    If you can write an import path that works, generally speaking this is considered a TS bug, though in some cases the module paths are so edge-case that we're not willing to generate them by default. You can log a (minimal) bug outlining the file path that should have been generated but wasn't, and we can take a look.

    Happy coding!

  28. locked as resolved and limited conversation to collaborators on Nov 19, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs More InfoThe issue still hasn't been fully clarified

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions