7

在 typescript 编译器开始对实际上已经在 webpack 的 ProvidePlugin 配置中配置的未解析变量大喊大叫后,有没有办法防止 WebPack 的构建过程失败?

webpack.config.js

plugins: [
...
new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery",
            "window.jQuery": "jquery",
            "_": "underscore",
            "underscore": "underscore"
            //'process.env.NODE_ENV': '"development"'
        }),

]

tsconfig.json

{
  "compilerOptions": {


    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "suppressImplicitAnyIndexErrors": true,
    "declaration": false
  },
  "exclude": [
    "node_modules",
    "typings/main",
    "typings/main.d.ts"
  ]
}

https://webpack.github.io/docs/list-of-plugins.html#provideplugin

根据我的经验,打字稿不知道哪些变量将被注入到模块中,因此构建没有完成。

这是构建的输出

ERROR in ./src/file1.component.ts
(77,9): error TS2304: Cannot find name '$'.

ERROR in ./src/file2.component.ts
(78,13): error TS2304: Cannot find name '$'.

ERROR in ./src/file3.ts
(155,15): error TS2304: Cannot find name 'jQuery'.

ERROR in ./src/file4.ts
(108,9): error TS2304: Cannot find name '$'.
4

3 回答 3

7

我对 ahz 的回答并不完全满意,因为我不喜欢全局安装类型或声明jQuery丢失any所有类型检查。

对我有用的解决方案是使用以下内容创建global.d.ts :

import * as _jQuery from 'jquery';

declare global {
  const jQuery: typeof _jQuery;
  const $: typeof _jQuery;
}

之后tsc通过没有任何警告,如Cannot find name '$'..

在这里找到。

于 2018-10-23T14:46:59.567 回答
1

如果我正确理解 ProvidePlugin,您仍然需要将 jQuery 和下划线声明为模块(外部或别名)。

因此,我建议在 TypeScript 中加载这些模块:

import * as $ from 'jquery';
import * as _ from 'underscore';

然后,您只需要为这些库提供定义 (.d.ts) 文件。我建议为此目的打字。

typings install jquery --global
typings install underscore --global

我假设您正在使用ts-loader来自动处理。

如果您想避免import语句,您仍然可以使用来自类型的定义来声明这些库。

或者您可以创建自己的简化声明:

declare var jQuery: any;
declare var $: any;
于 2016-06-23T17:07:01.397 回答
0

我将通过说有一些例外来补充最佳答案,这是解决它们的方法。我使用 Ant-Design 和 Redux 解决了这个问题。

当你使用这个:

import _Fake from 'fake-lib'

declare global {
  const Fake: typeof _Fake
}

它有效,但仅适用于已导出为命名空间(如 React)的库。在这种情况下,您可以安全地执行以下操作:

const x: Fake.Property // GOOD: Fake acts as a namespace
Fact.Function          // GOOD: Fake acts a concrete type that contains Function

另一方面,我有没有导出为命名空间(如 Redux)的库并导致了这个:

const x: Fake.Property // FAIL: Fake is not a namespace
Fact.Function          // GOOD: Fake acts a concrete type that contains Function

为了规避这个问题,您基本上可以全局扩展库以将其视为命名空间导出,如下所示:

修改您的 tsconfig.json 以添加新的 hack

"compilerOptions": {
    ...
},
"include": [
    "./src/**/*",
    "./types/**/*"
]

并添加一个types/fake.d.ts包含

import * as Fake from 'fake-library'

export as namespace Fake
export = Fake

现在完成这些更改后,全局 const 声明将正常工作。

于 2020-10-27T21:13:36.290 回答