我试图在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 / 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};
在这两种情况下,这就是传统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”函数,并尝试将其绑定到类的范围.然而,功能不存在于类中并导致错误“_这不被定义”.
当我添加“功能”关键字时,该功能被解释为我的意图并且正常工作.
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 + "\\}",arguments[i].toString()); } return formatted; };