2012-10-31 16 views
6

Aşağıdaki kodu kullanıyorum:.top jquery TypeScript definition dosyalarını eksik mi?

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

typescript bana söyleyen bir hata mesajı veriyor:

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

Ben tahmin ediyorum bir şey jQuery tanım dosyası eksik. Bu sorunu başka biri gördü mü yoksa normalde jQuery ile kullanılmayan bir şey mi? Daha önce görmediğim bir şey.

Daha fazla bilgi için. jquery.d.ts Dosyadan

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

cevap

4

(hat 374 sürümümde):

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

türü tanımı beklediğini hiçbir parametrelerle işlevi çağırmak suretiyle İşte bu kullanılan koddur Object türünü döndürme işlevi. JQuery belgelerine baktım ve siz doğru, iade edilen nesnenin üzerinde top ve left özelliklerinin olması beklenir.

Ne yazık ki, dönüş türüne göre aşırı yükleme gibi bir şey olmadığından, JQuery arabirimine başka bir üye ekleyemezsiniz. Bu özel durumda, tip tanımı basit olması gerektiği kadar spesifik olmadığından, jquery.d.ts dosyanızın değiştirilmesini ve dönüş türünün değiştirilmesini tavsiye ederim (belki de sayı yerine string?):

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

olumsuz döküm olacak: bunun yerine bu dosyayı değiştirmek istemiyorsanız

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

, ayrıca bunun üzerinde herhangi özelliklerine erişmeden önce any için, örnek sonucunu döküm seçeneğine sahip Bu fonksiyonu hiçbir parametreyle çağırdığınızda her zaman gereklidir. ? Yerine bu

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

ait

+1

Eğer '(ofset do Could deneyin: {top: numarası; sol: sayı; }; '' TS tanımında isteğe bağlı? –

+0

@mcpDESIGNS Aslında çalışmış olduğunu düşündüm, ancak değiştirilmiş bildirimi olan benim düzenlenmiş jquery.d.ts hala kullanıyordum. Her neyse, hayır, 'offset' üyesini isteğe bağlı yapmak, sadece 'JQuery' arayüzünün geçerli bir uygulamasına sahip olmak için uygulanması gerekmediği anlamına gelir. Üyeleri gizlemek için kullanabileceğiniz görünmüyor; jquery.d.ts dosyasına eklemeye çalışırsanız, offset'in diğer aşırı yüklenmelerinin geçerli olmasını engellersiniz. Ayrıca, "ofset" olarak bildirmeniz gerekecek mi? :() => {üst: sayı; sol: sayı; sözdizimsel olarak geçerli olmak için. – nxn

0

) bu

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