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

2023-11-23

我正在尝试用 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 未定义...”

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

export class MoreString extends 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};

在这两种情况下,this 都指的是函数的范围,就像经典的 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 未定义”。

当我添加“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;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 TypeScript 中扩展基本类型,错误:“_this 未定义...” 的相关文章

随机推荐