2014-04-14 21 views
8

Próbuję wywołać metodę instancji klasy TypeScript (w projekcie ASP.NET MVC). Jednak w środowisku wykonawczym dostaję wyjątki, takie jak 0x800a01b6 - JavaScript runtime error: Object doesn't support property or method 'checkString'.Funkcja klasy TypeScript niedostępna

Skopiowałem wygenerowany kod JavaScript w jsfiddle, gdzie metoda wydaje się działać.
Nie jestem facetem JavaScript, więc każda pomoc jest doceniana!

Czego próbowałem dotąd:

  1. różnych przeglądarek (Chrome: Uncaught TypeError: undefined is not a function, FF: TypeError: this.checkString is not a function)
  2. przeglądarka polana buforuje
  3. usuwanie tymczasowych plików IIS Express,
  4. czyszczenie i przebudowywanie rozwiązania
  5. nie używając prywatnego modyfikatora
  6. rozpoczęciem projektu na innym komputerze
  7. zastępującego underscore.js połączenia z manekina do verfiy że nie jest problem
  8. zaznaczone, że członkowie instancji są prawidłowo ustawione

Jest to kod maszynopis:

class FormData { 
    BlogName: string; 
    CacheTimeOut: number; 
    CopyrightHolder: string; 
    NavBarTitle: string; 
    MarkdownExtra: boolean; 
    MarkdownSanitize: boolean; 
    RatingActive: boolean; 
    HtmlEditor: boolean; 

    constructor(blogName: string, cacheTimeOut: number, copyrightHolder: string, navBarTitle: string, markdownExtra: boolean, markdownSanitize: boolean, ratingActive: boolean, htmlEditor: boolean) { 
     this.BlogName = blogName; 
     this.CacheTimeOut = cacheTimeOut; 
     this.CopyrightHolder = copyrightHolder; 
     this.NavBarTitle = navBarTitle; 
     this.MarkdownExtra = markdownExtra; 
     this.MarkdownSanitize = markdownSanitize; 
     this.RatingActive = ratingActive; 
     this.HtmlEditor = htmlEditor; 
    } 

    private checkString(value: string): boolean { 
     return _.isString(value) && value !== ''; 
    } 

    validate(): boolean { 
     return (this.checkString(this.BlogName) && this.checkString(this.CopyrightHolder) && this.checkString(this.NavBarTitle) && _.isNumber(this.CacheTimeOut) && !_.isNull(this.MarkdownExtra) && !_.isNull(this.MarkdownSanitize) && !_.isNull(this.RatingActive)); 
    }  
} 

//I'm calling the validate function like that (from within the same module) 
var form = getFormData(); //returns a FormData instance 
if (!form.validate()) { 
    //foo 
} 

I tu generowane JavaScript:

var FormData = (function() { 
    function FormData(blogName, cacheTimeOut, copyrightHolder, navBarTitle, markdownExtra, markdownSanitize, ratingActive, htmlEditor) { 
     this.BlogName = blogName; 
     this.CacheTimeOut = cacheTimeOut; 
     this.CopyrightHolder = copyrightHolder; 
     this.NavBarTitle = navBarTitle; 
     this.MarkdownExtra = markdownExtra; 
     this.MarkdownSanitize = markdownSanitize; 
     this.RatingActive = ratingActive; 
     this.HtmlEditor = htmlEditor; 
    } 
    FormData.prototype.checkString = function (value) { 
     return _.isString(value) && value !== ''; 
    }; 

    FormData.prototype.validate = function() { 
     return (this.checkString(this.BlogName) && this.checkString(this.CopyrightHolder) && this.checkString(this.NavBarTitle) && _.isNumber(this.CacheTimeOut) && !_.isNull(this.MarkdownExtra) && !_.isNull(this.MarkdownSanitize) && !_.isNull(this.RatingActive)); 
    }; 
    return FormData; 
})(); 

Odpowiedz

20

Jest to prawdopodobnie spowodowane złym this w czasie wykonywania. Można użyć funkcji lambda ()=>{} zamiast function, aby upewnić się, że this jest zawężona leksykalnie w wygenerowanym JavaScript:

validate =(): boolean => { 
     return (this.checkString(this.BlogName) && this.checkString(this.CopyrightHolder) && this.checkString(this.NavBarTitle) && _.isNumber(this.CacheTimeOut) && !_.isNull(this.MarkdownExtra) && !_.isNull(this.MarkdownSanitize) && !_.isNull(this.RatingActive)); 
    } 

proszę sprawdzić co this oznacza w javascript i maszynopisu, aby dowiedzieć się więcej.

+0

Dziękuję, ja stoi ten sam problem podczas wywoływania funkcji jako Jquery Event. "To" odnosiło się do zdarzenia, a nie do klasy. Twoje rozwiązanie rozwiązało mój problem. Wciąż nie wyjaśnia, dlaczego tak się dzieje w Maszynopisie. Musi być inny sposób. – Manny

+2

https://www.youtube.com/watch?v=tvocUcbCupA wyjaśnia, dlaczego tak się dzieje – basarat

3

Another Bypass-Style Rozwiązanie:
zamiast korzystania this., można użyć super..

  • Warunkiem wstępnym jest utworzenie dwóch klas, jednej jako klasy bazowej, drugiej jako klasy użytkowej.
  • Klasa podstawowa zawiera metody, które chcesz wywołać w konstruktorze.
  • użytkowej klasy wywołuje metodę od wewnątrz To konstruktora używając super.myMethod(); zamiast this.myMethod();

Jest to subtelny korzyści wykonana łatwo możliwe dzięki maszynopis.:)

Przykład:
Źródło: Typescript Bypass Solution on Stackoverflow

export class myBaseClass 
{ 
    constructor(ctx:any) 
    { 
     this.ctx = ctx;   // Audio context saved into member variable of class 
    } 
    myBaseMethod() 
    { 
     // Do Complex Work 
    } 
} 

export class myUsableClass extends myBaseClass 
{ 
    constructor(ctx:any) 
    { 
     super(ctx); 
     super.myBaseMethod(); // Use super., Not this. 
    } 

} 
Powiązane problemy