【问题标题】:TypeScript: flag class methods with extended Function prototypeTypeScript:使用扩展函数原型标记类方法
【发布时间】:2014-05-09 11:51:44
【问题描述】:

我想通过扩展函数原型来标记类方法。

所以我这样做是为了扩展原型:

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。

有没有办法“标记”类方法?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    有没有办法“标记”类方法?

    在构造函数内部

    constructor(){
        this.bar.$flag();
    }
    

    这似乎有点奇怪,因为它会创建有效的 JavaScript。

    一旦您进入 Typescript 类,您的“有效 javascript”就不再是有效的 ecmascript 5。

    【讨论】:

    • 这会导致每个类的创建都调用$flag 函数,这可能是意料之外的。
    • 问题中没有写这样的要求。我想说如果一个人想影响原型,首先写一个。不必在 Typescript 中编写类仍然可以从类型系统中受益,而类则失去了 javascript 的大部分动态特性。但是,您想做的事情在 ES6 中应该是可能的。
    • (这不是我的问题,我只是在澄清您的回答中可能不清楚的一个方面。)
    【解决方案2】:

    你可以使用 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 所示,你可以在构造函数中这样做。

    【讨论】:

    • 除了bar 不再在原型上,这可能是不可取的。
    【解决方案3】:

    由于您实际上是在使用 ECMAScript 6 功能来描述一个类(使用 TypeScript 扩展来添加类型),因此您建议的语法是有效的,实际上是无效的。你不能声明一个函数,然后以你正在做的方式“标记”它。

    其他建议的替代方法是在定义类后调用函数:

    class Foo {
        bar() { }
    }
    
    Foo.prototype.bar.$flag();
    

    虽然它可能缺乏优雅,但它只在课堂上完成一次。诚然,它不如“归因”函数那么好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 2016-10-23
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多