【问题标题】:Typescript compiler is not detecting a missing import for lodash with webpackTypescript 编译器未检测到带有 webpack 的 lodash 的缺失导入
【发布时间】:2019-10-28 13:14:57
【问题描述】:

我正在尝试使用official tutorial 在我的项目中使用 Typescript 设置 webpack。这是我的文件夹结构和重要文件:

├── dist
│   ├── bundle.js
│   └── index.html
├── package-lock.json
├── package.json
├── src
│   └── index.ts
├── tsconfig.json
└── webpack.config.js

src/index.ts:

// import _ from 'lodash';

const result = _.add(5, 6);
console.log(result);

webpack.config.js:

const path = require('path');

module.exports = {
  entry: './src/index.ts',
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
    ],
  },
  resolve: {
    extensions: [ '.tsx', '.ts', '.js' ],
  },
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
};

tsconfig.json:

{
    "compilerOptions": {
      "outDir": "./dist/",
      "noImplicitAny": true,
      "strict": true,
      "module": "es6",
      "target": "es5",
      "allowSyntheticDefaultImports": true
    }
  }

请注意,在 index.ts 中,lodash 的导入(我运行 npm i lodash @types/lodash)被注释掉了。这应该是 TS 错误,但这是我在 VSCode 中看到的:

此外,我可以通过运行npx webpack 将项目编译成一个包(tsc src/index.ts 也可以)。但是,当我在浏览器中打开文件时,我会在控制台中看到:

很明显,这表明 TS 假定 _ 是全局定义的(不确定如何),即使包本身并未实际导入。取消注释导入修复了 ReferenceError,但我不明白为什么 Typescript Compiler 没有意识到 lodash 没有导入并报告编译错误。

不过,我确实注意到的一件事是,当我将文件更改为以下内容时,我收到此警告,并在 _.add 的下划线下方显示一条波浪形的红线:

// import _ from 'lodash';
import a from 'lodash';

const result = _.add(5, 6);
console.log(result);

'_' 指的是一个 UMD 全局,但当前文件是一个模块。考虑改为添加导入。 ts(2686)

【问题讨论】:

    标签: typescript webpack types compiler-errors


    【解决方案1】:

    lodash 类型声明一个全局变量_。这意味着只要这些类型包含在您的项目中,TypeScript 就会选择_ 的全局定义。

    此外,您在使用_ 时看到警告的原因是模块文件(使用importexport 的文件)是在模块中访问全局通常是意外的。最佳做法是始终使用正确的导入

    【讨论】:

    • 那么这是否会被认为是 Lodash 开发人员的错误?因为即使类型可用,除非我通过库导入它们,否则我应该无法使用它们,对吧?
    • 不,这是故意的。仍然有很多 Web 开发人员会使用 <script> 标签导入 lodash。定义一个全局 _ 支持这样的用例(但不幸的是,在不鼓励或无法使用全局变量的情况下,它可能会导致混淆)
    • 明白了。感谢您的澄清!
    • 今晚遇到了这个问题,并决定测试 TypeScript 编译器是否允许我在不导入 Lodash 的情况下使用它(因为它会从类型中看到声明的全局变量)。我收到了这条消息:'_' refers to a UMD global, but the current file is a module. Consider adding an import instead.ts(2686)。所以看起来 TypeScript 编译器足够聪明,可以看到我已经有导入和导出,并且知道我使用 Lodash 的正确方法是将它导入我的模块中。
    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2013-02-22
    • 2017-08-24
    • 1970-01-01
    相关资源
    最近更新 更多