是否可以为装饰器功能编写类型签名(我的意思是装饰器设计模式装饰器,而不是打字稿装饰器功能)?

我尝试了这个:

function decorate<T extends () => any>(callback: T): T {
    return (...args) => {
        console.log('called with args: ', args);
        return callback(...args);
    };
}

但它给了我TS2322: Type '(...args: any[]) => any' is not assignable to type 'T'.

#1楼 票数:0 已采纳

您可以在3.0中使用Rest参数和扩展表达式中的元组来执行此操作

function decorate<A extends any[], R>(callback: (...a: A) => R): (...a: A) => R {
    return (...args) => {
        console.log('called with args: ', args);
        return callback(...args);
    };
}

function foo(s: number) {
    return s.toString();
}


function bar(s: number, o : string[]) {
    return s.toString();
}

var dBar = decorate(bar) // (s: number, o: string[]) => string
var dFoo = decorate(foo) // (s: number) => string

正如评论中指出的,有一些警告。 泛型不适用于这种方法。 另外,上面的函数不能正确处理重载。 有关过载问题的解决方法,请参见此答案

编辑

一个版本,可以减少警告,但在实现中需要一些类型断言,该版本与您建议的版本很接近:

function decorate<T extends (...a: any[]) => any>(callback: T): T {
    return ((...args) => {
        console.log('called with args: ', args);
        return callback(...args);
    }) as any;
}

这样可以更好地捕获输入与输出相同的内容,如果不需要对返回类型或参数进行其他类型的操作,则它是更可取的。 尽管此版本破坏了实现类型的安全性,但要获得完全的呼叫站点安全性,这是可以接受的折衷方案,因为它将与重载和泛型一起使用。

  ask by amik translate from so

未解决问题?本站智能推荐:

1回复

打字稿高级订单组件作为装饰器

我正在尝试在我的React项目中使用Typescript,但我却陷入了让我的HOC运行的类型。 这是一个最小的例子来展示我遇到的问题: 这会返回错误: 我真的不明白为什么会出现这种错误。 我一定做错了什么。 一旦我介绍道具,事情变得更加毛茸茸。 我非常感谢正确的解决方案,但我也
1回复

打字稿装饰器和箭头功能

我正在尝试实现Typescript方法装饰器,如下所示。 并如下使用。 但是我试图找出如何将装饰器与Arrow函数实现结合使用,如下所示。 但是以上实现在编译时显示以下错误。 错误TS2322:类型'(目标:任何,propertyKey:字符串,描述符:TypedPropert
1回复

简化打字稿装饰器功能

我在Typescript中遇到了以下装饰器: 第一行看起来很复杂,我很想对其进行重构,但是我不明白它的作用。 有人可以指导我如何解释这段代码吗? 我的最佳尝试是遵循以下几行: TSLint抱怨使用Function : “避免使用Function类型。建议使用特定的函数类型,例如()
1回复

打字稿装饰器功能通用类型

我正在创建一个 Express rest API,同时也在研究创建我自己的装饰器函数。 我现在正在为控制器类创建一个装饰器。 但是每当我想将此装饰器添加到控制器时,我都会收到以下错误: 此错误不会在 stackblitz 中弹出(它应该在 ZoneController 的装饰器中弹出),但有关代码,
1回复

打字稿,装饰异步功能

我正在尝试使用一些异步函数#2来装饰异步函数#1。 例如 因此,主要思想是在装饰器中执行一些异步操作,然后在main函数中执行其他异步调用。 是否有可能使用打字稿装饰器? 先感谢您。
1回复

打字稿装饰器不使用箭头功能

我有一个打字稿装饰工厂,控制台记录执行函数所花费的总时间,实际的函数执行结果和传递给装饰器的参数。 例如 我正在使用上面的装饰器,它具有一个类中的函数:(考虑到我的类还有其他方法,如ctor,get,set和utils)。 函数调用如下所示: 这给了我完美的输出: 但是当我更
1回复

测试打字稿装饰器

我有一个简单的装饰器,可以在满足某些条件时触发stopPropagation()或preventDefault()。 我已经在我的应用中对此进行了测试,并且确定装饰器可以正常工作。 但是我无法测试装​​饰器,是否触发了上述方法。 执行测试时,出现此错误: core.decorator
3回复

打字稿方法装饰器

我有这个代码 换句话说,我尝试(使用装饰器)更改方法 有了这个 但 this.name 评估为未定义。 如果我控制台记录“这个”似乎是正确的(例如男人)。