2016-11-17 12 views
0

私はASP.Net MVCアプリケーションのフロントエンドのために専らtypescriptで作業しようとしています。これはモジュールなしでは現在動作しており、依存関係の追跡は煩雑になっています。それで、RequireJSを導入し、TypescriptのAMDサポートを利用するときです。typescsコンパイラフラグは、エラーとしてシム定義を必要とします。それを修正するには?

私はこれについてたくさん読んでおり、私は非常に近いと思います。しかし、私はtypesScriptのimport文で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とブートストラップがページ上に必要であることを知っています。

///

​​

私はjQueryのを必要とするブートストラップとブートストラップを必要と反応している注意事項:私は私のrequireJSの設定のために、このセットアップを持っています。だから、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

私はノックアウトをロードするためにrequireJSを使用して扱うこのpart of the typescript documentation渡って走りました。それに

、彼らは簡単にノックアウトのためのタイプ定義ファイルをロードするためにあなたを教えて:

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

npm install --save @types/knockout

これはtypescriptですコンパイラが未知のパッケージに文句を停止するために必要な魔法であることが判明しました。

上記の例では、jQueryの型定義ファイルをインストールしていたため、コンパイラはjQueryについて不平を言っていませんでした。しかし、respond.jsの型定義ファイルはありませんでした。 respond.jsの型定義ファイルがなかったので、コンパイラはrespond.jsを探し、require文の引数がインポートするファイルを見つけるためのパスであると仮定します。私はrequireがファイルがtypescriptファイルであると仮定し、ファイルを探すと信じています。私はrespond.jsファイルを見つけるのにrequireステートメントを得ることができなかったからです。

最終的には、AMDを使用するように設定されていると2つの方法でインポートが機能します(まだ他の設定とは話せません)。

  1. モジュール名を使用して、それが知っている型定義ファイルと一致するようにします。型定義ファイルと一致する場合、モジュール名はその引数名だけであるとみなされ、生成されたjavascriptのrequireコマンドに渡されます。この時点で、そのモジュールをロードするためのインフラストラクチャを構築する必要があります(つまり、htmlページでファイルを直接ロードするか、requireJSコンフィグレーションでそのモジュールをロードする方法が分かります)

    import $ = require( "jQuery"); // requireJSからロードする

  2. プロジェクト内のソースファイルを検索するために名前を使用します。指定された引数は、ソースファイルへの相対パスです。

    I.e. import g = require( "コンポーネント/ greeter"); //プロジェクトのComponentsディレクトリからgreeter.tsモジュールをロードします。これは、requireJSを介してロードするようにも設定する必要があります。

これは将来誰かに役立つことを願っています。

関連する問題