7

次のコードを使用しています。

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

Typescript から次のようなエラー メッセージが表示されます。

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

jQuery定義ファイルに何かが欠けていると思います。他の誰かがこの問題を見たことがありますか、それともこれは 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

2 に答える 2

4

jquery.d.ts ファイルから (私のバージョンでは 374 行目):

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

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

残念ながら、戻り値の型に基づいてオーバーロードするようなものはないため、JQueryインターフェイスに別のメンバーを追加することはできません。この特定のケースでは、型定義が本来あるべきほど具体的ではないため、単純に jquery.d.ts ファイルを変更して戻り値の型を次のように変更することをお勧めします (おそらく数値ではなく文字列ですか?)。

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

このファイルを変更したくない場合は、そのファイルのanyプロパティにアクセスする前に結果をキャストするオプションもあります。次に例を示します。

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

欠点は、パラメーターなしでその関数を呼び出すたびにキャストが必要になることです。

于 2012-10-31T07:06:32.007 に答える
0

これの代わりに

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

これを試して

 $('html, body').animate({ scrollTop: $(this).offset().top });
于 2012-10-31T08:33:00.003 に答える