如何为子目录中的模块添加类型定义?

How to add type definitions for module in subdirectory?

我正在尝试模拟使用 axios using nock. This integration has some issues historically, but the workaround described in this issue 作品发出的请求。当我将 Typescript 引入组合时,我的问题就出现了。虽然 axios 带有主库的类型定义文件,但 nockaxios 集成需要从子目录导入,如下所示:

import HttpAdapter from 'axios/lib/adapters/http';

Typescript 编译器抱怨此行出现以下错误:

TS7016: Could not find a declaration file for module 'axios/lib/adapters/http'. 'C:/Users/<user>/<project>/node_modules/axios/lib/adapters/http.js' implicitly has an 'any' type.
  Try `npm install @types/axios` if it exists or add a new declaration (.d.ts) file containing `declare module 'axios';`

我该如何解决这个错误?我尝试了 axios 的自定义类型定义的各种组合,类似于:

// <project>/src/types/axios.d.ts

declare module 'axios/lib/adapters/http` {
    import { Adapter } from 'axios';

    const HttpAdapter: Adapter;

    export default HttpAdapter;
}

我对 Typescript 不是很有经验,所以我的理论是我的自定义定义文件在错误的位置,使用了错误的模块名称,或者没有导出正确的东西。任何帮助将不胜感激。


其他上下文

打字稿版本: 2.9.2

tsconfig.json的(相关)内容:

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "module": "esnext",
    "target": "es5",
    "lib": ["es2015", "es2017", "dom"],
    "moduleResolution": "node",
    "rootDir": "src",
    "noImplicitAny": true,
    "typeRoots": ["./src/types", "./node_modules/@types"]
  }
}

像其他 TS 文件一样在 files/include 下添加类型目录。假设所有源文件都在 src 中,这应该有效:

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "module": "esnext",
    "target": "es5",
    "lib": ["es2015", "es2017", "dom"],
    "moduleResolution": "node",
    "rootDir": "src",
    "noImplicitAny": true

    // This is automatically done by "moduleResolution": "node"
    // "typeRoots": ["./node_modules/@types"]
  },

  // Also make sure to add any other directories as needed
  "include": ["src/**/*"]
}