在TypeScript中扩展基本类型,错误:“_这未定义...”

时间:2013-09-16 18:52:47

标签: javascript inheritance prototype typescript

我正在尝试在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;
};

除了这个错误,因为“_this not defined ...”

我尝试过的其他事情是创建一个新类来扩展字符串...

export class MoreString extends string {

}

但是这也行不通,因为你只能扩展类,而string / String不是类,而是以类型构建。

扩展String并访问我的扩展方法的最简单方法是什么?

4 个答案:

答案 0 :(得分:11)

我在当天晚些时候遇到了另一个问题,这让我看到了这里发生的事情。从顶部开始,这里是......

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

当您从参数前面删除该功能时,它不再是经典功能。它变成了“胖箭”功能,显然即使不使用“=&gt;”句法。在上面的例子中,“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;
};

答案 1 :(得分:2)

在完全相似的情况下,我这样做:

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

}

这只是为了满足编译器。您可以像在javascript中一样实现这些方法。

希望有所帮助。

答案 2 :(得分:2)

我认为这与stride相同,但你只需在javascript(javascript是有效的typescript)中扩展它,然后连接新功能。

简短的例子:

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

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

alert("test".myExtension());

答案 3 :(得分:1)

您需要像这样扩展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];
        });
    }
}

实施来源: Equivalent of String.format in jQuery