我正在尝试在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并访问我的扩展方法的最简单方法是什么?
答案 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];
});
}
}