簡體   English   中英

在TypeScript中擴展基本類型,錯誤:“_這未定義...”

[英]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];
        });
    }
}

實現源: jQuery中String.format的等價物

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM