tsc抛出`TS2307:无法找到本地文件的模块`

时间:2016-05-31 14:40:37

标签: typescript

我有一个使用TypeScript的简单示例项目:https://github.com/unindented/ts-webpack-example

运行tsc -p .tsc版本1.8.10)会引发以下情况:

app/index.ts(1,21): error TS2307: Cannot find module 'components/counter'.
components/button/index.ts(2,22): error TS2307: Cannot find module 'shared/backbone_base_view'.
components/button/index.ts(3,25): error TS2307: Cannot find module 'shared/backbone_with_default_render'.
components/counter/index.ts(2,22): error TS2307: Cannot find module 'shared/backbone_base_view'.
components/counter/index.ts(3,25): error TS2307: Cannot find module 'shared/backbone_with_default_render'.
components/counter/index.ts(4,27): error TS2307: Cannot find module 'shared/backbone_with_subviews'.
components/counter/index.ts(5,20): error TS2307: Cannot find module 'components/button'.

它抱怨所有本地文件的导入,如下所示:

import Counter from 'components/counter';

如果我将它更改为相对路径它可以工作,但我不想这样做,因为它会让我的生活在移动文件时更加困难:

import Counter from '../components/counter';

vscode代码库不使用相对路径,但一切正常,所以我必须在项目中遗漏一些内容:https://github.com/Microsoft/vscode/blob/0e81224179fbb8f6fda18ca7362d8500a263cfef/src/vs/languages/typescript/common/typescript.ts#L7-L14

你可以查看我的GitHub仓库,但如果它有帮助,我正在使用的tsconfig.json文件:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "noImplicitAny": false,
    "removeComments": false,
    "preserveConstEnums": true,
    "sourceMap": true,
    "outDir": "dist"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}

有趣的是,使用webpack通过ts-loader构建项目工作正常,所以我猜这只是一个配置问题......

9 个答案:

答案 0 :(得分:66)

@vladima回复this issue on GitHub

  

编译器如何解析模块的方式由   moduleResolution选项,可以是nodeclassic(更多   可以找到详细信息和差异here)。如果省略此设置   如果模块为node,则编译器将此设置视为commonjs   classic - 否则。在您的情况下,如果您想要classic模块   与commonjs模块一起使用的解析策略 - 您需要设置   它明确地使用

{
    "compilerOptions": {
        "moduleResolution": "node"
    }
}

答案 1 :(得分:5)

在某些情况下,您只需要更新include数组即可。

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist",
    "sourceMap": false,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*.ts", "tests/**/*.ts"],
  "exclude": ["node_modules", ".vscode"]
}

答案 2 :(得分:2)

  

vscode代码库不使用相对路径,但一切都可以正常使用

真的取决于你的模块加载器。如果您将systemjsbaseurl一起使用,那么它就能正常运行。 VSCode使用自己的自定义模块加载器(基于旧版本的requirejs)。

建议

使用commonjs支持的相对路径。如果你移动文件你会得到一个打字稿编译时错误(一件好事)所以你会比绝大多数纯js项目更好(在npm)。

答案 3 :(得分:2)

在VS2019中,项目属性页的 TypeScript Build 选项卡具有“模块系统”的设置(下拉列表)。当我将其从“ ES2015”更改为 CommonJS 时,VS2019 IDE不再抱怨它找不到axios或redux-thunk(TS2307)。

tsconfig.json:

{
  "compilerOptions": {
    "allowJs": true,
    "baseUrl": "src",
    "forceConsistentCasingInFileNames": true,
    "jsx": "react",
    "lib": [
      "es6",
      "dom",
      "es2015.promise"
    ],
    "module": "esnext",
    "moduleResolution": "node",
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "outDir": "build/dist",
    "rootDir": "src",
    "sourceMap": true,
    "strictNullChecks": true,
    "suppressImplicitAnyIndexErrors": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "target": "es5",
    "skipLibCheck": true,
    "strict": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true
  },
  "exclude": [
    "build",
    "scripts",
    "acceptance-tests",
    "webpack",
    "jest",
    "src/setupTests.ts",
    "node_modules",
    "obj",
    "**/*.spec.ts"
  ],
  "include": [
    "src",
    "src/**/*.ts",
    "@types/**/*.d.ts",
    "node_modules/axios",
    "node_modules/redux-thunk"
  ]
}

答案 4 :(得分:0)

就我而言,

   //app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            //{
            //    HotModuleReplacement = true
            //});

我在startup.cs中评论了它

答案 5 :(得分:0)

如果使用网络风暴,请按Ctrl + Alt + S并打开设置窗口。 Languages&Frameworks> TypeScript,启用“使用tsconfig.json”选项。

答案 6 :(得分:0)

我很难用打字稿导入枚举

  

错误TS2307:找不到模块...

我要做的就是将枚举迁移到另一个文件并进行以下更改:

__init__.py

export enum MyEnum{
    VALUE = "MY_VALUE"
}

答案 7 :(得分:0)

我要做的就是重启docker。因此,如果您使用docker,请尝试

答案 8 :(得分:-4)

不要使用:从“api/xxxx”导入 UserController 应该是:从“./api/xxxx”导入UserController