2012-10-31 9 views
6

私は、次のコードを使用しています:私は何かがjQueryの定義ファイルから欠落している推測していjquery TypeScript定義ファイルに.topがありませんか?

The property 'top' does not exist on value of type 'Object' 

$('html, body').animate({ scrollTop: $($(this).attr('href')).offset().top }); 

活字体は言ってくれたエラーメッセージを与えています。他の誰かがこの問題を見たことがありますか、これは通常jQueryで使われていないものですか?私が以前見たことのないものです。

詳細については、

$.fn.buildTableOfContent = function() { 
     "use strict"; 
     var h2 = this.find('h2'); 
     if (h2.length > 0) { 
      var h1 = this.find('h1:first'); 
      if (h1.length === 0) { 
       h1 = this.prepend('<h1>Help</h1>').children(':first'); 
      } 
      var menu = h1.wrap('<div class="h1 with-menu"></div>') 
        .after('<div class="menu"><img src="/Content/images/menu-open-arrow.png" width="16" height="16"><ul></ul></div>') 
        .next().children('ul'); 
      h2.each(function (i) { 
       this.id = 'step' + i; 
       menu.append('<li class="icon_down"><a href="#step' + i + '">' + $(this).html() + '</a></li>'); 
      }); 
      menu.find('a').click(function (event) { 
       event.preventDefault(); 
       $('html, body').animate({ scrollTop: $($(this).attr('href')).offset().top }); 
      }); 
     } 
     return this; 
    }; 

答えて

4

(私のバージョンでライン374)jquery.d.tsファイルから:ここでは、これが使用されているコードがある

interface JQuery { 
    ... 
    offset(): Object; 
    offset(coordinates: any): JQuery; 
    offset(func: (index: any, coords: any) => any): JQuery; 
    ... 
} 

型定義が期待するパラメータなしで機能を呼び出すことにより、 Object型を返す関数。私はjQueryのドキュメントを見て、あなたは正しいです、返されたオブジェクトは、topleftのプロパティを持つと予想されます。

残念ながら、戻り値の型に基づいてオーバーロードするようなことはないので、JQueryインターフェイスに別のメンバーを追加することはできません。この特定のケースでは、型定義が特定のものではないので、単純にjquery.d.tsファイルを変更し、戻り値の型を次のように変更することをお勧めします。

$('html, body').animate({ scrollTop: (<any> $($(this).attr('href')).offset()).top }); 

欠点があるキャストは次のようになります。あなたは、むしろ、このファイルを変更しません場合は

offset(): { top : number; left : number; }; 

は、あなたもそれに任意のプロパティにアクセスする前anyに、例を結果をキャストするオプションがありますパラメータなしでその関数を呼び出すたびに必要です。代わりに、この

$('html, body').animate({ scrollTop: $($(this).attr('href')).offset().top }); 

+1

を試してみてください、あなたは ')(オフセット行うことができませんでした:{トップ:数;?左:番号。 }; 'TS定義の'?: 'オプションを使用していますか? –

+0

@mcpDESIGNS実際にはうまくいったと思っていましたが、変更された宣言を持つ私の編集したjquery.d.tsをまだ使っていました。とにかく、 'offset'メンバをオプションにすることは、' JQuery'インタフェースの有効な実装を持たせるために実装する必要がないことを意味します。メンバーを非表示にすることはできません。 jquery.d.tsファイルに追加しようとすると、 'offset'の他のオーバーロードが有効にならないようになります。また、オフセットとして宣言する必要がありますか? :()=> {トップ:数字;左:番号。 }; 'それが構文的には有効であっても。 – nxn

0

この

$('html, body').animate({ scrollTop: $(this).offset().top }); 
関連する問題