[英]Extend Basic Types in TypeScript, Error: “_this is not defined…”
我試圖在TypeScript中重寫我的一些JavaScript代碼。 這些代碼中的一些引用了我添加到字符串對象原型的擴展。
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;
};
但是,使用類型腳本添加它非常具有挑戰性。
我已經看到了一些示例,其中您聲明了基本接口的擴展,然后將一個函數分配給原型以匹配接口並提供您的功能。 像這樣......
interface String {
showString: () => string;
}
String.prototype.showString = (): string {
return this;
};
除了這個錯誤,因為“_這個沒有定義......”
我嘗試過的其他事情是創建一個新類來擴展字符串...
export class MoreString extends string {
}
但是這也行不通,因為你只能擴展類,而string / String不是類,而是內置類型。
擴展String並訪問擴展方法的最簡單方法是什么?
當天晚些時候,我最終遇到了另一個問題,讓我看到了這里發生的事情。 從頂部開始,這里是......
TypeScript是建立在JavaScript之上的,所以像@Nypan所說的JavaScript是有效的TypeScript。 因此,差異很容易被忽視。
像這樣的JavaScript函數引用函數用“this”執行的范圍。
var f = function (postFix) {return this + postFix};
要添加TypeScript語法,您需要定義類型
var f = function (postFix: string): string {return this + postFix};
在這兩種情況下,這都指的是函數的范圍,就像經典JavaScript一樣。 但是,當我們這樣做時,情況就會改變......
var f = (postFix: string): string {return this + postFix};
//or more correctly
var f = (postFix: string): string => {return this + postFix};
當您從參數前面刪除該功能時,它不再是經典功能。 它變成了“胖箭”功能,顯然即使沒有使用“=>”語法。 在上面的例子中,“this”現在指的是函數存在於C#中的類。
在我嘗試將函數分配給字符串的原型時,我省略了function關鍵字,因此它被解釋為“Fat Arrow”函數並嘗試將其綁定到類的范圍。 但是,該類函數不存在於類中並導致錯誤“_this not defined”。
當我添加“function”關鍵字時,該函數按我的意圖解釋並正常工作。
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;
};
在完全相似的情況下,我這樣做:
interface String {
endsWith(str);
startsWith(str);
}
這只是為了滿足編譯器。 您可以像在javascript中一樣實現這些方法。
希望有所幫助。
我認為這是大步相同的事情,但你只是在javascript中擴展它(javascript是有效的typescript),然后界面新的功能。
簡短的例子:
String.prototype.myExtension = function () {
return this + " something."
};
interface String {
myExtension : () => string;
}
alert("test".myExtension());
您需要像這樣擴展String接口:
interface String {
stringFormat(...args: string[]): string;
}
你需要這樣實現
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];
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.