2016-11-17 59 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加載。

我希望這可以幫助別人在未來。

相關問題