2016-11-17 58 views
0

我想在ASP.Net MVC应用程序的前端打字稿中专门使用。目前这个模块没有模块,依赖关系跟踪越来越繁重。因此是时候引入RequireJS并使用Typescript对AMD的支持。typescript编译器标记requirejs填充定义为错误。如何解决它?

我已经阅读了很多关于这个,我想我非常接近。但是,我遇到了打字机导入语句的问题,说它找不到在requireJS配置中定义的填充模块。因此,如果typescript只是将模块的名称传递给JS代码中的require函数,那么一切都会很好。但它没有,它只是抛出一个错误。所以问题是我该如何写这些JS垫片的导入声明?

下面是一个例子: app.ts

import g = require("Api/greeter"); 
import $ = require("jquery"); 
import respond = require("respond"); 

var greeter = new g.Greeter("#content"); 
greeter.start(); 

让我们假设这是用于页面的主TS和招待员是该页面的视图模型。但我知道我需要在页面上使用jquery和bootstrap。我有这样的设置为我requireJS配置:

///

​​

通知我有回应,要求引导和引导,需要jQuery的。所以有app.ts需要回应应该(并且)吸引响应,引导和jQuery。

我知道我在app.ts中有一个多余的require(“jQuery”)。这仅用于说明目的。即,该行工作正常 - TS将jQuery识别为有效的模块名称并将其放入生成的编译的JS文件中。但是,TS不承认“回应”作为一个模块的名字,我得到一个编译错误:

Cannot find module 'respond'. 

我已经安排了这样的我的文件:

Scripts 
->Api 
    --> Greeter.ts 
-> App 
    --> App.ts 
-> libs 
    --> jQuery-3.1.1.js 
    --> bootstrap.js 
    --> respond.js 

我认为我做得很好时的jQuery工作,但我如何得到回应或任何其他纯粹的JS库,我不得不拉入工作?根据我在TS文档中可以看到的,require()的参数应该是JS文件的有效路径,因为这是编译器如何获取类型信息。但是,如果是这样的话,为什么jQuery按照我定义的方式工作?它与respond.js没有区别。

感谢 格雷格

+0

我可能刚刚回答了我自己的问题。我认为这里重要的信息是我安装了jQuery.d.ts和require.d.ts,但没有得到一个.d.ts文件来作出回应。 我想了一想,因为我试图推动包括淘汰赛。 VS在击倒时给了我同样的错误,就像在回应中一样。然后我安装了knockout.d.ts,突然间我的错误消失了。 –

回答

0

我碰到这个part of the typescript documentation与使用requireJS加载淘汰赛交易跑去。

在书中,他们简单地告诉您加载类型定义文件淘汰赛:

We’ll also grab declaration files for Knockout to describe the library’s shape for TypeScript.

npm install --save @types/knockout

这原来是被需要的打字稿编译器停止抱怨未知包的魔力。

在上面列出的例子中,我安装了jQuery的类型定义文件,因此编译器没有抱怨jQuery。但是我没有用于respond.js的类型定义文件。由于没有用于respond.js的类型定义文件,编译器随后查找respond.js,并且它假定require语句的参数是它可以用来查找要导入的文件的路径。我相信require要求文件是一个打字稿文件并寻找一个。因为我无法获得require语句来查找respond.js文件。

底线是,配置为使用AMD时,导入有两种工作方式(我不能说其他配置)。

  1. 它使用模块的名称来匹配它所知道的类型定义文件。如果它匹配一个类型定义文件,它假定模块的名称就是该参数的名称,并将其传递给生成的javascript中的require命令。此时,您有责任构建加载该模块的基础结构(即,您的html页面直接加载文件,或者更有可能的是,您的requireJS配置知道如何加载该模块)

    也就是说, import $ = require(“jQuery”); //通过requireJS config加载

  2. 它使用名称在项目中查找源文件。指定的参数是源文件的相对路径。

    I.e. import g = require(“Components/greeter”); //从项目的Components目录加载greeter.ts模块。这应该设置为通过requireJS加载。

我希望这可以帮助别人在未来。

相关问题