Shrike
Shrike

Reputation: 9500

TypeScript: tsc failed to compile a dependant library (inside a project) which depends on a js library and @types typing package

Given a library (let's call it LibraryA) that uses another library without typing - particularly js-yaml. To do so LibraryA has a devDependency @types/js-yam in its package.json. LibraryA itself compiles just fine.

Now I have a project where I installed LibraryA as a dependency (in devDependencies). In that project I imported types from the LibraryA and so that LibraryA gets compiled by tsc when I compile the whole project. But tsc reports an error about code in LibraryA where I import js-yaml (import yaml from 'js-yaml'):

error TS7016: Could not find a declaration file for module 'js-yaml'.

I checked the node_modules for the project, and there's no @types/js-yaml there. So, it explains why tsc can't see the typings. But I can't understand why it wasn't installed in the first place (when I installed LibraryA).

project
 package.json
   devDependencies
     LibraryA

LibraryA
  package.json
    dependencies
      "js-yaml": "^4.1.0",
    devDependencies
      "@types/js-yaml": "^4.0.5",

js-yaml

So, probably the question is about npm and why it doesn't install "@types/js-yaml inside the project.

Upvotes: 1

Views: 546

Answers (2)

tenshi
tenshi

Reputation: 26324

"@types/js-yaml" is listed as a dev dependency. These are only installed during the development of the library for the developers to use. Usually, this includes testing frameworks, bundlers, and of course, TypeScript types. However, this doesn't mean that when you install the library, it should also install these dev dependencies. Why would you need or even care about what the authors used to write the library?

Also, your package manager doesn't read your mind; it won't install packages for you unless you explicitly tell it to do so. Here, you should probably explicitly install js-yaml and @types/js-yaml as a dev dependency yourself.

And another reason why it shouldn't install the library's @types/js-yaml: if the versions of the js-yaml you want to use and the js-yaml the library uses, you might have conflicting types! That's really annoying when trying to develop something (wrong autocomplete/suggestions, things that don't exist at runtime, etc).

Upvotes: 0

Archigan
Archigan

Reputation: 122

Because it is a different package, per se. I think it doesn't install automatically because @types is an organisation in npm, and not all npm packages explicitly list @types/package-name as a dependency, particularly if is has custom types.

TypeScript typings in npm @types org packages

Upvotes: 1

Related Questions