繁体   English   中英

打字稿签名,用于高级装饰器功能

Typescript signature for higher-order decorator function

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

我尝试了这个:

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 个回复

您可以在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;
}

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

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

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

2 简化打字稿装饰器功能

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

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

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

4 打字稿装饰器和箭头功能

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

5 打字稿打字功能签名

我正在做一个打字稿项目,在某些情况下,我感到自己重复了一遍,但我不知道如何做得更好。 万一重要,我正在使用TypeScript 2.4 考虑此接口接受带有特定签名的textFunction属性 然后我在ES6类中有一个getter,如果没有提供textFunction ,它将提供 ...

6 打字稿,装饰异步函数

我正在尝试用一些异步函数#2 装饰异步函数#1。 例如 所以,主要思想是在装饰器中执行一些异步操作,然后在主函数中执行其他异步调用。 是否可以使用打字稿装饰器来实现这一点? 先感谢您。 ...

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

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

8 typescript 装饰器中的内部参数

下面是一个创建装饰器decorate并将其应用于 class 成员的示例程序。 decorate装饰器旨在接受与 class 成员相同的参数。 但是,该程序可以编译,因为我已将装饰器的T泛型强制推断为any 。 我正在寻找一种将 arguments 正确推断为装饰器 function 并使编译失败 ...

9 打字稿成员装饰器

我想创建自定义成员装饰器,我的意思是: 根据打字稿规范,此类装饰器的功能参数为: 为什么会有原型传递给该函数? 为什么不是原始类,而是基类? 我想指的是原始类,而不是基类。 我有什么办法可以引用原始类,也许是通过使用target构造函数属性,它是原始类的构造函数? 装饰器 ...

10 如何实现打字稿装饰器?

TypeScript 1.5现在有装饰器。 有人可以提供一个简单的例子来展示实现装饰器的正确方法并描述可能的有效装饰器签名中的参数的含义吗? 此外,在实现装饰器时是否应牢记任何最佳实践注意事项? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM