打字稿装饰器和箭头函数

Posted

技术标签:

【中文标题】打字稿装饰器和箭头函数【英文标题】:Typescript Decorators and Arrow Function 【发布时间】:2015-12-12 19:58:05 【问题描述】:

我正在尝试如下实现一个 Typescript 方法装饰器。

function dataMethod(name: string, options: any)         
    return (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) =>         

    

它的用法如下。

class HelloWidgetExtesion          
    @dataMethod("getData", )
    public getData(name: any, cb: any) 
        cb(null, "");
    

但我正在尝试弄清楚如何使用装饰器和箭头函数实现,如下所示。

class HelloWidgetExtesion          
    @dataMethod("getData", )
    public getData = (name: any, cb: any) => 
       cb(null, "Greetings from Loopback!");
    

但是上面的实现在编译时会出现如下错误。

错误TS2322:类型'(目标:任何,propertyKey:字符串,描述符: TypedPropertyDescriptor) => void' 不可分配给类型 '(target: Object, propertyKey: string | symbol) => void'.

Demo of the issues.

【问题讨论】:

【参考方案1】:

在最后一种情况下,字段getData 被编译器视为属性(不是纯方法)。 这意味着 descriptor 参数不会在编译的 javascript 文件中传递。

您所需要的只是修改您的装饰器并使descriptor 字段可选。考虑这个例子:

function dataMethod(name: string, options: any)         
    return (target: any, propertyKey: string, descriptor?: TypedPropertyDescriptor<any>) =>         

    

我修改了你的例子here

祝你好运

相关资源(感谢@David Sherret)

    Decorators signature

【讨论】:

领先我几秒钟 :) 这是正确的。类上的箭头函数不是方法——它是属性——因此装饰器的实现需要与方法和属性装饰器函数签名兼容,如 Oleg 的示例所示。 (See here 用于属性和方法装饰器签名) 谢谢 Oleg Dokuka 和 David Sherret! 如何为 .js 文件配置它?

以上是关于打字稿装饰器和箭头函数的主要内容,如果未能解决你的问题,请参考以下文章

带有箭头功能的打字稿装饰器

带有箭头函数的打字稿重载方法

打字稿 - 在箭头(回调)函数中使用它 - 猫鼬

在打字稿中应用箭头函数作为对象属性

打字稿重载箭头功能不起作用

类装饰器上的打字稿文档-返回“类扩展构造函数”的函数