Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript:使用扩展函数原型标记类方法_Typescript - Fatal编程技术网

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中做什么应该是可能的。这不是我的问题,我只是澄清了你答案中可能不清楚的一个方面。