2012-10-31 6 views
6

Ich verwende den folgenden Code ein:.top fehlt in jquery TypeScript-Definitionsdateien?

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

Typoskript gibt mir eine Fehlermeldung,:

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

Ich vermute, etwas aus der jQuery-Definitionsdatei fehlt. Hat jemand anderes dieses Problem gesehen oder ist das etwas, das normalerweise nicht mit jQuery verwendet wird? Es ist etwas, was ich vorher nicht gesehen habe.

Für weitere Informationen. Hier ist der Code, wo diese verwendet werden:

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

Antwort

4

Von der jquery.d.ts Datei (Linie 374 in meiner Version):

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

Durch die Funktion ohne Parameter aufgerufen wird die Typdefinition erwartet die Funktion, um einen Object Typ zurückzugeben. Ich schaute auf die Dokumentation für jQuery und Sie sind richtig, das zurückgegebene Objekt wird voraussichtlich top und left Eigenschaften haben.

Da es auf der Grundlage des Rückgabetyps keine Überladung gibt, können Sie leider kein weiteres Element auf der Schnittstelle JQuery hinzufügen. Da in diesem speziellen Fall die Typdefinition einfach nicht so spezifisch ist, wie es sein sollte, würde ich empfehlen, einfach Ihre jquery.d.ts-Datei zu ändern und den Rückgabetyp so zu ändern, dass er wie folgt aussieht (vielleicht String statt Nummer?):

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

Wenn Sie lieber diese Datei nicht ändern, haben Sie auch die Möglichkeit, das Ergebnis zu any Gießen, bevor alle Eigenschaften auf sich, beispielsweise den Zugriff auf:

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

der Nachteil die Besetzung ist wird jedes Mal, wenn Sie diese Funktion ohne Parameter aufrufen.

+1

konnte nicht Sie 'Offset(): {top: Zahl; links: Nummer; }; 'Verwenden Sie das'?: 'optional in der TS-Definition? –

+0

@mcpDESIGNS Ich dachte, dass es tatsächlich funktionierte, aber ich benutzte immer noch meine bearbeitete jquery.d.ts, die die modifizierte Deklaration hatte. Anyway, no, macht das 'offset' Mitglied optional bedeutet nur, dass es nicht implementiert werden muss, um eine gültige Implementierung der' JQuery' Schnittstelle zu haben. Es scheint nicht, dass Sie damit Mitglieder verstecken können; Wenn Sie versuchen, es der Datei jquery.d.ts hinzuzufügen, verhindern Sie, dass die anderen Überladungen von offset gültig sind. Außerdem müssten Sie es als "Offset" deklarieren. :() => {top: nummer; links: Nummer; }; 'um es sogar syntaktisch gültig zu haben. – nxn

0

anstelle dieses

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

versuchen diese

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