Skip to content

Can not find local declaration file for scoped packages #23999

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
mlippert opened this issue May 9, 2018 · 5 comments · Fixed by #26121
Closed

Can not find local declaration file for scoped packages #23999

mlippert opened this issue May 9, 2018 · 5 comments · Fixed by #26121
Assignees
Labels
Bug A bug in TypeScript Domain: Error Messages The issue relates to error messaging Fixed A PR has been merged for this issue Help Wanted You can do this

Comments

@mlippert
Copy link

mlippert commented May 9, 2018

I am using the noImplicitAny switch, but I'm not sure whether that matters other than not showing that the declaration file is not found as quickly. However I should be able to use the noImplicitAny switch by creating the required declaration file locally.

My testing seems to show that a local declaration file for a non-scoped package is found, but that one for a scoped package (@<scope>/name) is not.

The test sample I've attached uses the @feathersjs/express scoped package to demonstrate the issue.

Note that the feathersjs__express.d.ts file below does contain the declare module 'feathersjs__express'; as specified in the error message.

Also note that the contents of feathersjs__express.d.ts are basically identical to the contents of feathers-mongoose.d.ts which is correctly found (and when remove produces a similar TS7016 error.

TypeScript Version: 2.9.0-dev.20180506

Search Terms:
TS7016: Could not find a declaration file for module

Code

├── package.json
├── src
│   ├── feathersjs__express.d.ts
│   ├── feathers-mongoose.d.ts
│   └── index.ts
├── tsconfig.json

index.ts

import { express } from '@feathersjs/express';
import { service } from 'feathers-mongoose';

feathers-mongoose.d.ts

declare module 'feathers-mongoose'
{
    function init(options: string): any;

    namespace init
    {
        export let service: (options: string) => any;
    }

    export = init;
}

feathersjs__express.d.ts

declare module 'feathersjs__express'
{
    function feathersExpress(feathersApp: string): any;

    namespace feathersExpress
    {
        export let express: (feathersApp: string) => any;
    }

    export = feathersExpress;
}

Zip file containing the sources (as in the tree above)
ts_bug_src.zip

Expected behavior:
No errors

Actual behavior:

src/index.ts:1:25 - error TS7016: Could not find a declaration file for module '@feathersjs/express'. '/home/mjl/Projects/riff/test/node_modules/@feathersjs/express/lib/index.js' implicitly has an 'any' type.
  Try `npm install @types/feathersjs__express` if it exists or add a new declaration (.d.ts) file containing `declare module 'feathersjs__express';`

1 import { express } from '@feathersjs/express';
                          ~~~~~~~~~~~~~~~~~~~~~

Playground Link:

Related Issues:

@mhegazy
Copy link
Contributor

mhegazy commented May 10, 2018

the file name is irrelevant. in both files you are using declare module "..." { .. } form which is a global declaration..

in the file feathersjs__express, you are saying to the compiler "I know a module exists, whose name is "feathersjs__express" and this is its type".

the problem is you are not naming the module correctly, i.e. your module should look like:

declare module '@feathersjs/express' {
    function init(options: string): any;

    namespace init {
        export let service: (options: string) => any;
    }

    export = init;
}

@mhegazy mhegazy added the Question An issue which isn't directly actionable in code label May 10, 2018
@mlippert
Copy link
Author

@mhegazy I believe that the file name is irrelevant, but then the error message is wrong, because I am naming the module exactly as specified by the error message (see above: add a new declaration (.d.ts) file containing 'declare module 'feathersjs__express';').

And that did work (I thought I had tried using the name early on w/o success, but I probably had other issues at that time).

Thanks, so I think this bug probably needs to be renamed to specify that the error message needs to be corrected.

@mhegazy mhegazy added Bug A bug in TypeScript Domain: Error Messages The issue relates to error messaging Help Wanted You can do this and removed Question An issue which isn't directly actionable in code labels May 10, 2018
@mhegazy mhegazy added this to the Community milestone May 10, 2018
@mhegazy
Copy link
Contributor

mhegazy commented May 10, 2018

A PR to update the error message would be appreciated.

@mnpenner
Copy link

mnpenner commented Aug 1, 2018

I just encountered this issue. Took me quite awhile to figure it out. Here's the Stackoverflow question I ended up creating because of it, and solution.

@mattmccutchen
Copy link
Contributor

This should be an easy PR. I'm working on it.

mattmccutchen added a commit to mattmccutchen/TypeScript that referenced this issue Aug 1, 2018
unmangled package name where appropriate.

Add a test case for an untyped sub-module of a scoped package with
typings.  The other diagnostic message is covered by existing tests; I
guess no one looked at the baselines closely enough.

Fixes microsoft#23999.
@RyanCavanaugh RyanCavanaugh added the Fixed A PR has been merged for this issue label Aug 2, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug A bug in TypeScript Domain: Error Messages The issue relates to error messaging Fixed A PR has been merged for this issue Help Wanted You can do this
Projects
None yet
6 participants