TypeScript:使用扩展函数原型标记类方法
我想通过扩展函数原型来标记类方法 所以我这样做是为了扩展原型:TypeScript:使用扩展函数原型标记类方法,typescript,Typescript,我想通过扩展函数原型来标记类方法 所以我这样做是为了扩展原型: interface Function { $flag(): Function __flagged__: boolean } Function.prototype.$flag = function (): Function { this.__flagged__ = true; return this; }; 这很好,但我不能像这样标记类方法 class Foo { bar(): void:
interface Function {
$flag(): Function
__flagged__: boolean
}
Function.prototype.$flag = function (): Function {
this.__flagged__ = true;
return this;
};
这很好,但我不能像这样标记类方法
class Foo {
bar(): void: {
// Do stuff
}.$flag()
}
当试图调用.$flag方法时,编译器抛出一个语法错误,这似乎有点奇怪,因为它会创建有效的JavaScript
有没有办法标记类方法
有没有办法标记类方法
构造函数内部
constructor(){
this.bar.$flag();
}
这似乎有点奇怪,因为它会创建有效的JavaScript
一旦您的脚本在Typescript类中,您的有效javascript就不再是有效的ecmascript 5。您可以使用lambda实现相同的效果:
interface Function {
$flag(): Function
__flagged__: boolean
}
Function.prototype.$flag = function (): Function {
this.__flagged__ = true;
return this;
};
class Foo {
bar = ((): void => {
// Do stuff
}).$flag()
}
您可以对成员变量执行此操作,这些变量是如图所示的函数
但是,您尝试执行的操作无法内联完成,因为这是一个语法错误。但是如果你真的想这样做,你可以在构造函数中这样做,如mpm所示。因为你基本上是在使用ECMAScript 6特性来描述一个带有类型脚本扩展的类来添加类型,你建议的语法是有效的,实际上是无效的。您不能声明一个函数,然后以您正在执行的方式标记它 提出的其他建议的一种替代方法是在定义类后调用函数:
class Foo {
bar() { }
}
Foo.prototype.bar.$flag();
虽然它可能缺乏优雅,但在课堂上只做了一次。无可否认,将函数属性化并不如将其属性化好。除了该条不再位于原型上之外,这可能是不可取的。这将导致每个类创建都调用$flag函数,这可能是出乎意料的。问题中没有这样的要求。我想说的是,如果你想影响原型,首先就写一个。人们不必用Typescript编写类,但仍然可以从typesystem中获益,因为类失去了javascript的大部分动态特性。然而,你想在ES6中做什么应该是可能的。这不是我的问题,我只是澄清了你答案中可能不清楚的一个方面。