9

我正在尝试用 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 is not defined...”

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

export class MoreString extends string {

}

但是,这也不起作用,因为您只能扩展类并且字符串/字符串不是类而是内置类型。

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

4

4 回答 4

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

在这两种情况下,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 is 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;
};
于 2013-09-17T14:59:12.940 回答
2

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

简短的例子:

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

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

alert("test".myExtension());
于 2013-09-17T11:44:51.593 回答
2

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

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

}

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

希望有帮助。

于 2013-09-16T20:50:09.217 回答
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];
        });
    }
}

实现来源: jQuery中String.format的等价物

于 2016-06-01T09:18:41.337 回答