2012-10-31 6 views
6

używam następujący kod:.top brakuje w plikach definicji języka jQuery?

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

Typescript daje mi komunikat o błędzie:

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

Domyślam coś brakuje pliku definicji jQuery. Czy ktokolwiek widział ten problem, czy jest to coś, czego zwykle nie używa się w jQuery? To coś, czego wcześniej nie widziałem.

Aby uzyskać więcej informacji. Oto kod, gdzie to ma zastosowanie:

$.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; 
    }; 

Odpowiedz

4

Z pliku jquery.d.ts (linia 374 w mojej wersji):

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

przez wywołanie funkcji bez parametrów definicja typu spodziewa funkcja zwracania typu Object. Przyjrzałem się dokumentacji jQuery i masz rację, zwracany obiekt ma mieć na nim właściwości top i left.

Niestety, ponieważ nie ma czegoś takiego jak przeciążenie w oparciu o typ zwrotu, nie można dodać innego członka do interfejsu JQuery. Ponieważ w tym konkretnym przypadku definicja typu nie jest po prostu tak szczegółowa, jak powinna, zaleciłbym po prostu zmodyfikowanie pliku jquery.d.ts i zmianę typu zwracanego, aby wyglądał następująco (być może ciąg zamiast numeru):

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

Jeśli wolisz nie zmodyfikować ten plik, masz również możliwość odlewania wynik any przed uzyskaniem dostępu do żadnych właściwości na niego, przykład:

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

minusem jest obsada będzie konieczne przy każdym wywołaniu tej funkcji bez parametrów.

+1

Czy nie robisz 'offsetu() {top: numer; left: number; }; 'przy użyciu'?: 'opcjonalnego w definicji TS? –

+0

@mcpDESIGNS Myślałem, że to zadziałało, ale wciąż używałem edytowanego jquery.d.ts, który miał zmodyfikowaną deklarację. W każdym razie, nie, uczynienie elementu "offset" opcjonalnym oznacza tylko, że nie musi być zaimplementowane, aby mieć poprawną implementację interfejsu 'JQuery'. Nie wydaje się, że możesz go użyć do ukrycia członków; jeśli spróbujesz dodać go do pliku jquery.d.ts, uniemożliwisz inne przeciążenia 'offset'. Co więcej, musisz zadeklarować to jako "offset"? :() => {top: liczba; left: number; }; 'nawet jeśli jest poprawny pod względem składniowym. – nxn

0

zamiast tego

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

spróbować

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