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

Que*_*mer 9 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;
};
Run Code Online (Sandbox Code Playgroud)

但是,使用类型脚本添加它非常具有挑战性.

我已经看到了一些示例,其中您声明了基本接口的扩展,然后将一个函数分配给原型以匹配接口并提供您的功能.像这样......

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

String.prototype.showString = (): string {
    return this;
};
Run Code Online (Sandbox Code Playgroud)

除了这个错误,因为"_这个没有定义......"

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

export class MoreString extends string {

}
Run Code Online (Sandbox Code Playgroud)

但是这也行不通,因为你只能扩展类,而string/String不是类,而是内置类型.

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

Que*_*mer 11

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

TypeScript是建立在JavaScript之上的,所以像@Nypan所说的JavaScript是有效的TypeScript.因此,差异很容易被忽视.

像这样的JavaScript函数引用函数用"this"执行的范围.

var f = function (postFix) {return this + postFix};
Run Code Online (Sandbox Code Playgroud)

要添加TypeScript语法,您需要定义类型

var f = function (postFix: string): string {return this + postFix};
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,这都指的是函数的范围,就像经典JavaScript一样.但是,当我们这样做时,情况就会改变......

var f = (postFix: string): string {return this + postFix};
//or more correctly
var f = (postFix: string): string => {return this + postFix};
Run Code Online (Sandbox Code Playgroud)

当您从参数前面删除该功能时,它不再是经典功能.它变成了"胖箭"功能,显然即使没有使用"=>"语法.在上面的例子中,"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;
};
Run Code Online (Sandbox Code Playgroud)