2013-09-16 15 views
9

Próbuję przepisać niektóre z mojego kodu JavaScript w TypeScript. Niektóre z tych kodów zawierają odwołania do rozszerzenia dodanego do prototypu obiektu typu string.Rozszerz podstawowe typy w TypeScript, Błąd: "_to nie jest zdefiniowane ..."

String.prototype.format = function() { 
    var formatted = this; 
    for (var i = 0; i < arguments.length; i++) { 
     formatted = formatted.replace(
      RegExp("\\{" + i + "\\}", 'g'), arguments[i].toString()); 
    } 
    return formatted; 
}; 

Jednak dodanie tego skryptu typu było dość trudne.

Widziałem przykłady, w których deklarujesz rozszerzenie podstawowego interfejsu, a następnie przypisujesz funkcję do prototypu, aby dopasować interfejs i zapewnić swoją funkcjonalność. Podobnie jak ...

interface String { 
    showString:() => string; 
} 

String.prototype.showString =(): string { 
    return this; 
}; 

wyjątkiem tego błędu, bo „nie jest zdefiniowane _this ...”

Inne rzeczy próbowałem jest stworzenie nowej klasy rozszerzenia ciąg ...

export class MoreString extends string { 

} 

Jednak to również nie działa, ponieważ można rozszerzać tylko klasy, a łańcuch/ciąg nie są klasami, ale wbudowanymi typami.

Jaki jest najprostszy sposób na rozszerzenie String i dostęp do mojej metody rozszerzenia?

Odpowiedz

11

skończyło się działa w innym wydaniu później w ciągu dnia, która mnie zobaczyć, co się tutaj dzieje. Z góry, tutaj jest ...

TypeScript jest zbudowany na bazie JavaScript, więc tak jak @Nypan mówi, że JavaScript jest poprawny TypeScript. Z tego względu różnice są bardzo łatwe do przeoczenia.

Funkcja JavaScript podobna do tej odnosi się do zakresu, w którym funkcja wykonuje się za pomocą "this".

var f = function (postFix) {return this + postFix}; 

Aby dodać składni maszynopis byłoby zdefiniować typy

var f = function (postFix: string): string {return this + postFix}; 

W obu tych przypadkach odnosi się do zakresu funkcji, tak jak klasyczne JavaScript. Jednak sytuacja zmienia się, gdy to zrobimy ...

var f = (postFix: string): string {return this + postFix}; 
//or more correctly 
var f = (postFix: string): string => {return this + postFix}; 

Po usunięciu z funkcji przed parametrach to już nie jest klasyczną funkcję. Staje się funkcją "Fat Arrow", najwyraźniej nawet bez użycia "=>". W powyższych przykładach "ten" odnosi się teraz do klasy, w której funkcja istnieje w C#.

Podczas mojej próby przypisania funkcji do prototypu napisu pominięto słowo kluczowe funkcji, więc zostało zinterpretowane jako funkcja "Fat Arrow" i próbuje powiązać to z zakresem klasy. Jednak dawka funkcjonalna nie istnieje w klasie i powoduje błąd "nie jest zdefiniowany".

Po dodaniu słowa kluczowego "funkcja" funkcja jest interpretowana zgodnie z zamierzeniami i działa poprawnie.

interface String { 
    format:() => string; 
} 

String.prototype.format = function() : string { 
    var formatted = this; 
    for (var i = 0; i < arguments.length; i++) { 
     formatted = formatted.replace(
      RegExp("\\{" + i + "\\}", 'g'), arguments[i].toString()); 
    } 
    return formatted; 
}; 
2

Dokładnie podobne sprawy i zrobić to tak:

interface String { 
    endsWith(str); 
    startsWith(str); 

} 

To tylko zaspokoić kompilatora. Implementujesz metody dokładnie tak, jak w javascript.

Nadzieję, że pomaga.

2

Myślę, że to jest to samo, co robił krok, ale po prostu rozszerzyć go w javascript (javascript jest prawidłowym maszynopisem), a następnie interfejs nowej funkcji.

Krótki przykład:

String.prototype.myExtension = function() { 
    return this + " something." 
}; 

interface String { 
    myExtension :() => string; 
} 

alert("test".myExtension()); 
+1

ale gdzie w kodujesz tę definicję? ponieważ dostaję właściwość "myExtension" nie istnieje na typie "String", więc nie kompiluje się. Mam ten fragment kodu wewnątrz definicji modułu. – Oscar

+0

To zadziałało dla mnie, TANKI! – Benoit

+0

@Oscar to samo, nie działa na kopalni –

1

Trzeba rozszerzyć interfejs String takiego:

interface String { 
    stringFormat(...args: string[]): string; 
} 

i trzeba wdrożyć jak tego źródła

module Utilities { 
    String.prototype.stringFormat = function(): string { 
     var args = arguments; 
     return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) { 
      if (m == "{{") { return "{"; } 
      if (m == "}}") { return "}"; } 
      return args[n]; 
     }); 
    } 
} 

realizacji: Equivalent of String.format in jQuery

+0

Znaczenie "modułu Narzędzia" ... DZIĘKUJĘ! – mlorber

Powiązane problemy