2016-11-23 4 views
1

私はタイコスクリプトの初心者です。私はいくつかの変更を加えるために既存のdurandalプロジェクトを取り上げています。このコードスニペットでランタイムエラーが発生しています。varを宣言しても定義されていないエラーが発生する

declare var routeLinks: IRouteLinks; 
routeLinks = new RouteLinks(); 
export = routeLinks; 

エラー=

私はしかし、問題は消え、コードが意図したとおりに動作しているようです(下記)declareキーワードを削除するためにコードを変更Failed to load root module (ui/shell). Details: routeLinks is not defined(…)

var routeLinks: IRouteLinks; 
routeLinks = new RouteLinks(); 
export = routeLinks; 

このパターンは、多くの場所で、私は私が行くとdeclareキーワードを削除し、それが問題を修正し、実行時例外を取得するたびに複製されます。

  • declareキーワードはこの 問題を引き起こし、そしてなぜそれがそれを修正削除して含め、なぜ誰も説明できますか?
  • declareをこの文脈で最初に使用する可能性はありますか(可能であれば初心者の言葉で)?
  • このコードが以前に動作していた場合、どのように私の箱に来るのですか? (typescriptまたはdurandalのバージョン間の変更はおそらく?)

ありがとうございました。

情報

さらに私は、この行は、我々はdeclareキーワード

var routeLinks; 

を使用するときにエラーが今より理にかなって不足している参照コンパイル済みのJSを比較する際に、さらにこれにしてみますdeclareを使用するとクロスコンパイラが変数宣言を削除するのはなぜですか?これは直感的ではないようです。

+0

これは、ランタイムエラーの権利がありますか?編集したものではない? –

+0

はい、実行時エラーです。 – gingerbreadboy

+1

'declare'は変数' routeLinks'が既に他の場所で定義されていることを意味し、このコードスニペットをロードする前に環境にロードする必要があります。 'declare'を削除すると、実際に変数宣言がコンパイルされたjsに出力されます。私は物事をどのように読み込むかわからないので、より具体的に答えるのは難しいです。 –

答えて

3

declareキーワードの背後にある考え方は、コードが環境にロードされるときに実行時に変数(またはクラス、関数など)が存在することをコンパイラに伝えることです。
たとえば、宣言ファイルを持たないライブラリを使用する場合に役立ちます。

例えば、以下のコード:この一方

console.log("loaded version: " + VERSION); 

declare var VERSION: string; 
console.log(`loaded version: ${VERSION}`); 

はにコンパイル

var VERSION: string; 
console.log(`loaded version: ${VERSION}`); 

コンパイルに:

var VERSION; 
console.log("loaded version: " + VERSION); 

declareキーワードを使用すると、コンパイラは無視し、生成されたjsに出力しません。

変数がおそらく実行時に定義されていない可能性があります。そのため、declareを削除するとエラーが発生しません。

あなたはここでそれについての詳細を読むことができます:Quick Tip – TypeScript Declare Keyword

関連する問題