在 TypeScript 中使用箭头函数:如何使它们成为类方法?

Posted

技术标签:

【中文标题】在 TypeScript 中使用箭头函数:如何使它们成为类方法?【英文标题】:Using arrow functions in TypeScript: how to make them class methods? 【发布时间】:2012-11-30 19:15:22 【问题描述】:

我的编程经验相当丰富,但对 TypeScript 还是很陌生。

尝试将它与 jQuery 一起使用并立即遇到回调的“this”问题(例如 $(document).ready。

使用 $.proxy() 是一种方法,但使用 TypeScript 的箭头 (lambda) 函数似乎要好得多。但我只看到它们用作表达式——即整个函数是内联定义的。我希望能够设置可以作为我的类的方法调用的箭头函数,例如(在伪代码中):

class Something 
    constructor() 
    $(' nav li').click(this.menuClick);
    
 private menuClick (and this would be an arrow function to preserve 'this')()=>    
  // it would call this.anotherMethod()
  // plus lots of other things so it won't easily fit inline

 private anotherMethod():void 
        // do something on the menu click, several lines perhaps, 
  


我来自 AS3 的 OOP 背景,这就是我能够做到这一点的方式——“this”很容易访问,或者很清楚如何访问它。我热衷于使用 TypeScript 来克服我在使用纯 javascript 时遇到的 OOP 障碍——但是(对我来说)必须代理所有 jQuery 调用似乎很麻烦(我知道那里有一些类可以做到这一点)我,但是有没有更简单的方法,带有箭头/lambda函数?)。

如果我不理解显而易见的事情,请耐心等待,但对我来说并不明显!

【问题讨论】:

【参考方案1】:

默认情况下无法执行此操作的原因是,如果自动完成,就每个实例的内存消耗而言,这是一个巨大的运行时成本。与其拥有一个包含所有函数的基本原型对象,并且每个类实例都指向该原型的函数定义,不如最终为类的每个实例的每个函数都有一个闭包。 p>

未来可能会有更好的类型系统支持,但目前,处理this 绑定问题只是编写任何风格的 JavaScript 时必须支付的税。希望随着 TypeScript 之类的发展势头强劲,库作者将减少对 this-stomping 的使用(尽管 DOM 永远不会有这种奢侈)。

好处是,在 TypeScript 中,当您确实需要重新绑定 this 时,代码量并不多:

$(' nav li').click(() => this.menuClick());

$(' nav li').click(this.menuClick.bind(this));

【讨论】:

谢谢。当我编译代码$(' nav li').click(() => this.menuClick()); 时,我得到Supplied parameters do not match any signature of call target 的那行代码,因为我使用参数定义menuClick,所以我可以访问单击的元素,因此:private menuClick(event:JQueryEventObject):void var li:JQuery = $(event.target).closest('li'); --- 我将如何进行箭头调用那么正确吗? 这应该可以工作:$('nav li').click((eventData) => this.menuClick(eventData));【参考方案2】:

简短的回答:

如果你改变:$(' nav li').click(this.menuClick);

转入:$(' nav li').click(() => this.menuClick());

那么this 将成为menuClick 方法中的类'Something'。

【讨论】:

以上是关于在 TypeScript 中使用箭头函数:如何使它们成为类方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 中,我可以轻松地键入命名箭头函数,但是如何在基于函数关键字的函数中做同样的事情呢?

如何在 TypeScript 中指定定义为对象文字的箭头函数的类型?

在 ES6/Typescript 中使用带有箭头函数的 _(下划线)变量

使用lambda /箭头函数的TypeScript抽象方法

在 typescript 或 javascript 中链接箭头函数

TypeScript的箭头函数