【问题标题】:How do i solve error "cannot find module 'jquery'" in my Typescript build如何在我的 Typescript 构建中解决错误“找不到模块 'jquery'”
【发布时间】:2017-05-02 13:45:40
【问题描述】:

我目前在我的“ts”文件顶部有这个 import $ = require("jquery"); 我这样做是因为我试图在我的打字稿文件中使用 jquery,但我似乎无法编译它,因为它返回所述错误在标题中。我正在使用 ASP.NET CORE

脚本文件夹

tsonfig.json

{
    "compilerOptions": {
        "noImplicitAny": true,
        "noEmitOnError": true,
        "sourceMap": true,
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "target": "es5",
        "module": "umd"
    },
    "files": [
        "wwwroot/js/player-page.ts",
        "wwwroot/js/playerDetails-page.ts",
        "wwwroot/js/DataTableSetting.ts"
    ],
    "compileOnSave": true
}

ma​​in.ts

require.config({
    baseUrl: "wwwroot/js/lib",

    paths: {
        jquery: "jquery-3.1.1"
    }
});

require(["jquery", "DataTable", "DataTableSetting"],
    ($: JQueryStatic, datatable: DataTables.DataTable, dataTableSetting: any) => {
        console.log($);
    });

ASP.NET MVC 布局页面

    <script data-main="~/js/lib/main" src="~/js/lib/require.js"></script>

控制台错误

http://requirejs.org/docs/errors.html#scripterror
    at makeError (require.js:5)
    at HTMLScriptElement.onScriptError (require.js:5)

TS 文件

import $ = require("jquery");
import DataTables = require("./DataTableSetting");

 export class Player {

        private playerTable: HTMLTableElement;

        constructor(playerTable: HTMLTableElement) {
            this.playerTable = playerTable;
            this.wireEvents(this.playerTable);
        }

        initDatatable(playerTable: HTMLTableElement) {
            $(playerTable).DataTable();
        }

        private wireEvents(playerTable: HTMLTableElement): void {
            const btnsUpdatePlayer = playerTable.querySelectorAll(".btnUpdatePlayer");

            Array.prototype.forEach.call(btnsUpdatePlayer,
                (btn: HTMLButtonElement) => {
                    btn.addEventListener("click", (e : Event)=> {
                        console.log(e.target);
                    }, false);
                });
        }
    }

window.onload = () => {
    var $dtPlayerTable = document.getElementById("tblPlayer");
    var playerTable: HTMLTableElement = <HTMLTableElement>$dtPlayerTable;
    const player = new Player(playerTable);
};

【问题讨论】:

  • 您的 TS 文件中是否包含 jquery.d.ts?
  • @Louis 嗨,是的,我确实尝试过 amd 模块.. 没有工作,这就是我切换到 umd 的原因
  • @Louis 如果您仔细阅读问题,您会在顶部看到一行:“我似乎无法编译”。在 StackOverflow 上提问的人混淆术语、库、概念等的情况并非闻所未闻。在这种特殊情况下,如果 OP 混淆了 TS 编译器和 RequireJS,我也不会感到惊讶。
  • @FyodorSoikin 是的,我没有仔细阅读并错过了那一点。我相信你是对的。
  • @ifelabolz 请发布您收到的实际错误消息

标签: javascript jquery typescript asp.net-core requirejs


【解决方案1】:

TypeScript 有两种模块:

  1. 隐式定义为磁盘上的文件。
  2. 由编码人员明确定义,说“即使此模块不是磁盘上的文件,但我保证它存在,并且这里是它包含的类型”。

在您的代码中,"./DataTableSetting" 模块属于第一类,"jquery" 模块属于第二类。 TypeScript 可以通过查看文件系统并发现那里的文件来验证 DataTableSetting 模块是否存在。

但是对于jquery,TypeScript 无法在磁盘上找到文件。所以它需要你的一点帮助。它需要你告诉它:“别担心,TypeScript,你找不到文件。我会确保这个模块在需要时确实存在,下面是它包含的类型 em>”。

告诉 TypeScript 一个模块存在的方式,即使它不在磁盘上,也是通过显式声明它,如下所示:

declare module "jquery" 
{
    class JQueryStatic 
    {
       ...
    }
    ...
}

此声明是文件jquery.d.ts 包含的内容。所以你实际上不需要自己写这个声明。

但是,这里有一个问题:TypeScript 编译器如何知道在哪里查找此声明?

实际上有两种方法可以指示您的声明所在的位置。

首先,您可以在player-page.ts 的顶部包含一个/// &lt;reference&gt; 指令,如下所示:

/// <reference path="../DefinitelyTyped/jquery.d.ts" />

这将有效地将jquery.d.ts 的内容“包含”在player-page.ts 的主体中,从而使模块"jquery" 的声明对代码可见。

其次,您可以使用tsconfig.json 指定查找类型定义的位置,通过指定compilerOptions/typeRoots:

{
   "compilerOptions": {
       "typeRoots" : ["wwwroot/js/DefinitelyTyped"],
       ...
   }
}

See full reference on tsconfig.json for more information.

【讨论】:

  • 非常有用的解释。让我的 VsCode 打字稿与 jquery thx 一起使用。
猜你喜欢
  • 1970-01-01
  • 2021-04-08
  • 2021-08-31
  • 2022-07-22
  • 1970-01-01
  • 2023-01-23
  • 2020-07-18
  • 2022-10-12
  • 2021-08-27
相关资源
最近更新 更多