找不到打字稿模块无法解析

时间:2020-06-20 08:44:50

标签: reactjs typescript webpack

我正在构建一个react + typescript应用程序,其中我创建了一个模块,该模块的接口在我项目的所有类中都被使用。我的IDE很好地解决了这些接口,但是webpack总是发送以下错误。我尝试了不同的方法,但无法解决。

任何帮助将不胜感激

ERROR in ./assets/src/Pages/Login.tsx Module not found: Error: Can't resolve 'seeyouftp' in 'var/www/app/assets/src/Pages'
 @ ./assets/src/Pages/Login.tsx 43:18-38
 @ ./assets/src/Config/App.tsx
 @ ./assets/entries/bundle.js

我的定义文件在这里

|— definitions
     |— types.d.ts
|— entries
|— fonts
|— less
|— src

我的定义文件摘录

declare module 'seeyouftp' {
  interface User {
    admin: boolean;
    roles: string[];
    username: string;
  }

  enum AuthStates {
    success = 'success',
    error = 'error'
  }

tsconfig.json

{
  "compilerOptions": {
    "allowJs": true,
    "allowUnreachableCode": false,
    "baseUrl": "./assets",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "jsx": "react",
    "lib": [
      "dom",
      "es2019",
      "esnext"
    ],
    "module": "commonjs",
    "moduleResolution": "node",
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "outDir": "./dist/",
    "resolveJsonModule": true,
    "skipDefaultLibCheck": true,
    "sourceMap": true,
    "strictPropertyInitialization": false,
    "strictNullChecks": true,
    "target": "es5",
    "typeRoots": [
      "./assets/definitions/types.d.ts",
      "./node_modules/@types"
    ],
    "types": [
      "node"
    ]
  },
  "include": [
    "./assets/src/**/*",
    "./assets/definitions/**/*"
  ],
  "exclude": [
    "node_modules"
  ]
}

我这样导入创建的接口:

import { Item, PlayableMedia } from 'seeyouftp';

4 个答案:

答案 0 :(得分:2)

该错误消息实际上是非常令人误解的,看起来像是打字稿错误。 看来enums无法直接导出,似乎必须使用 const才能正确导出它们。

所以我像这样修改了enum声明

declare module 'seeyouftp' {

  // exporting a const instead of 
  export const enum AuthStates {
    success = 'success',
    error = 'error'
  }
}

现在一切正常,但该错误消息非常非常糟糕且耗时

答案 1 :(得分:1)

尝试导出声明,看看是否有所不同:

declare module 'seeyouftp' {
export  interface User {
    admin: boolean;
    roles: string[];
    username: string;
  }

export  enum AuthStates {
    success = 'success',
    error = 'error'
  }

答案 2 :(得分:0)

您需要在seeyouftp下创建seeyouftp(假设/definitions是您的js模块名称)文件夹,并在types.d.ts内包含/definitions/seeyouftp,如下所示

|— definitions
 |—seeyouftp
  |— index.d.ts
|— entries
|— fonts
|— less
|— src

并更新您的tsconfig

"typeRoots": [
  "./assets/definitions",
  "./node_modules/@types"
],

答案 3 :(得分:0)

因为这是一个Webpack问题,所以您必须更新Webpack配置。需要告知Webpack在哪里找到模块seeyouftp

// webpack.config.js
const path = require('path');

module.exports = {
  //...
  resolve: {
    // Add an alias
    alias: {
      'seeyouftp': path.resolve(__dirname, 'definitions/types.d.ts')
    }
  }
};

对于文件types.d.ts的路径,我假设您的Webpack配置位于definitions文件夹旁边。

Here是相关的Webpack文档。