index.d.ts错误TS2307:找不到模块我自己的模块

时间:2019-11-15 01:52:39

标签: typescript eslint

我面临着无法解决的问题。 我想在我的班级文件之间共享一些接口和类型。

我的仓库就是这样:

test
  -> dist/
  -> src/
    -> index.ts
  -> .babelrc
  -> .eslintrc.js
  -> index.d.ts
  -> package.json
  -> tsconfig.json

index.d.ts中:

declare module test { // I've try with 'declare namespace test' but the result is the same
  export interface LabeledValue {
    label: string;
    size: number;
  }
}

如果我在LabeledValue中导入index.ts,则会出现错误,并且我不理解原因: import { LabeledValue} from 'test'; // TS2307: Cannot find module 'test'.

src / index.ts

import {LabeledValue} from 'test';

function printLabel(labeledObj: LabeledValue) {
  console.log(labeledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);

package.json:

{
  "name": "test",
  "types": "index.d.ts",
  "version": "1.0.0",
  "description": "test",
  "author": "oyabi",
  "license": "MIT",
  "private": true,
  "scripts": {
    "type-check": "tsc --noEmit",
    "type-check:watch": "yarn type-check --watch",
    "build": "npm run build:types && npm run build:js",
    "build:types": "tsc --emitDeclarationOnly",
    "build:js": "babel src --out-dir dist --extensions \".ts,.tsx\" --source-maps inline"
  },
  "dependencies": {
    "axios": "^0.19.0",
    "body-parser": "^1.18.3",
    "express": "^4.16.4",
    "helmet": "^3.21.2",
    "morgan": "^1.9.1",
    "winston": "^3.1.0"
  },
  "devDependencies": {
    "@babel/cli": "^7.7.0",
    "@babel/core": "^7.7.2",
    "@babel/plugin-syntax-class-properties": "^7.0.0",
    "@babel/polyfill": "^7.7.0",
    "@babel/preset-env": "^7.7.1",
    "@babel/preset-typescript": "^7.7.2",
    "@babel/runtime": "^7.7.2",
    "@types/express": "^4.17.2",
    "@types/helmet": "^0.0.45",
    "@types/morgan": "^1.7.36",
    "@types/qrcode": "^1.3.4",
    "@typescript-eslint/eslint-plugin": "^2.7.0",
    "@typescript-eslint/parser": "^2.7.0",
    "apidoc": "^0.18.0",
    "babel-core": "^7.0.0-bridge",
    "babel-eslint": "^10.0.1",
    "babel-jest": "^24.8.0",
    "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-preset-airbnb": "^4.2.0",
    "babel-preset-env": "^1.7.0",
    "eslint": "^6.6.0",
    "eslint-config-airbnb-base": "^14.0.0",
    "eslint-config-prettier": "^6.5.0",
    "eslint-friendly-formatter": "^4.0.1",
    "eslint-plugin-import": "^2.18.2",
    "eslint-plugin-jest": "^23.0.4",
    "eslint-plugin-prettier": "^3.1.0",
    "jest": "^24.8.0",
    "moxios": "^0.4.0",
    "nodemon": "^1.19.4",
    "prettier": "^1.19.1",
    "retire": "^2.0.1",
    "supertest": "^4.0.2",
    "typescript": "^3.7.2",
    "uuid": "^3.3.2"
  }
}

.babelrc

{
  "presets": ["@babel/typescript",
    ["airbnb", {
      "useBuiltIns": "usage"
    }]
  ],
  "plugins": [
    "syntax-class-properties",
    "transform-class-properties"
  ]
}

.eslintrc

module.exports = {
  root: true,
  parser: "@typescript-eslint/parser",
  parserOptions: {
    sourceType: "module",
    project: "./tsconfig.json"
  },
  env: {
    node: true,
    jest: true
  },
  extends: [
    "airbnb-base",
    "plugin:@typescript-eslint/recommended",
    "plugin:jest/recommended",
    "plugin:prettier/recommended",
    "prettier/@typescript-eslint",
    "plugin:import/errors",
    "plugin:import/warnings",
    "plugin:import/typescript"
  ],
  plugins: ["@typescript-eslint", "jest", "import"],
  rules: {
    "import/no-commonjs": "error",
    "import/no-amd": "error",
    // allow debugger during development
    "no-debugger": process.env.NODE_ENV === "production" ? 2 : 0,
    "no-underscore-dangle": 0,
    "prettier/prettier": [
      2,
      {
        printWidth: 80,
        singleQuote: true,
        trailingComma: "all"
      }
    ]
  },
  settings: {
    "import/resolver": {
      node: {
        extensions: [".js", ".jsx", ".ts", ".tsx"]
      }
    }
  }
};

tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "module": "commonjs",
    "declaration": true,
    "outDir": "./dist",
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "noImplicitThis": true,
    "esModuleInterop": true,
    "resolveJsonModule": true
  },
  "include": ["index.d.ts"]
}

我的真实代码更加复杂,但是您对问题有一个很好的了解。 该错误出现在Visual Studio代码中,并带有yarn build(带有实际代码)。使用此代码,您可以使用yarn tsc src/index.ts来显示错误。

您知道我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

您正在使用ES导入进行导入:

import {LabeledValue} from 'test';

因此,您需要具有ES模块(不是namespace/module关键字,它们是TypeScript模块)。

修复

您的index.d.ts应该如下所示:

  export interface LabeledValue {
    label: string;
    size: number;
  }

根级别export使文件成为ES模块,现在您的ES import将可以工作。

答案 1 :(得分:0)

我解决了安装eslint-import-resolver-typescript和默认配置的问题。