如何设置包装给定函数的函数的类型

2024-02-22

我正在做一个简单的memoize函数,它的作用是接受一个函数,并在缓存返回结果的地方做一些魔法。但基本上返回函数的类型memoize与给定的完全相同。但我遇到了错误,我不知道如何修复。当使用该函数并忽略我遇到的错误时,这些类型可以工作。

我已经制作了两个函数来展示我的问题,从我的角度来看,两种类型都应该有效,但我越来越接近第二种实现,但它仍然不起作用。

这是一个链接TypeScript 游乐场 https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABAWwKbLjAXqgjAHgDFFUAPKVMAEwGdEAKAOmYEMAnAcxoC5EWwAngG0AugEpEAXgB8iAAps4yGDVT5+A6dPqhIvQmP2IA3gChEFxG1RQQbJE1acaEmYl0RHjdlzGmAvqamHrAIKOiYOABMRCTklLQMzN7OvBqirrIKSipqGlo64BD6hklOXLxy7CxoFGw0RNKZiABKNnZgACoCAA5qhLJmllbt9mUpvlKyHl4+LgFBEAg0UO4w9auS4RjYePT0zcb+EgD0J4gAwko9ADYsMGA0pkuPq6ovVFLbkXssNAKQBiHY6IM6IADqcDYAGsni8VogoAALdafLZoHbRfbA07nK7IW73R7PZarYBwOzIr4Yn5Reh-AEQIFTEwgsGQmFPIA但为了防止它过期,我将发布一些代码和一些显示错误的图片:

function memoize1<F extends (...args: any[]) => Promise<any>>(func: F): F {
    return (...args) => func(...args)
}

function memoize2<F extends (...args: any[]) => Promise<any>>(func: F): (...args: Parameters<F>) => ReturnType<F> {
    return (...args) => func(...args)
}

const first = memoize1(() => {}) // Complains
const second = memoize1(async () => {}) // Works
const third = memoize2(() => {}) // Complains
const fourth = memoize2(async () => {}) // Works

这是错误图像,其中一张用于第一个例子 https://i.stack.imgur.com/GiAfI.png and 第二个例子 https://i.stack.imgur.com/MpdRe.png


有一个有趣的issue https://github.com/microsoft/TypeScript/issues/35858在 github 上根据你的问题中提到的这种行为。显式转换为所需类型应该可以消除由以下函数引起的编译错误:

function memoize1<F extends (...args: any[]) => Promise<any>>(func: F): F {
    return ((...args) => func(...args)) as F
}

function memoize2<F extends (...args: any[]) => Promise<any>>(func: F): (...args: Parameters<F>) => ReturnType<F> {
    return (...args) => func(...args) as ReturnType<F>
}

memoize1 调用失败的原因是给定的参数函数没有返回 memoize1 指定的承诺F extends (...args: any[]) => Promise<any>

所以打电话memoize1(() => {})传递一个返回空对象而不是承诺的函数。通过使用 async 语句,函数返回类型更改为 Promise。这就是为什么memoize1(async () => {}) work.

例如:const first = memoize1(() => new Promise((resolve, reject)=> {})传递一个返回 Promise 并会编译的函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设置包装给定函数的函数的类型 的相关文章

随机推荐

  • Python 中 *tuple 和 **dict 是什么意思? [复制]

    这个问题在这里已经有答案了 正如 PythonCookbook 中提到的 可以添加在元组之前 什么是 意思是这里 第 1 18 章 将名称映射到序列元素 from collections import namedtuple Stock na
  • Weblogic 12c (12.1.3) - 字符串索引超出范围:51968

    我正在尝试部署一个Spring BootWeblogic 12 1 3 上的 Web 应用程序 当我从控制台部署时 我收到以下错误 在应用程序上 Message icon Error Unable to access the selecte
  • 如何区分页面刷新和关闭页面

    我有一个网络应用游戏 在游戏中我想拥有它 这样如果用户关闭页面或浏览器 它会自动注销 我尝试使用附加到窗口的 onbeforeunload 事件 window onbeforeunload function perform logout f
  • WCF / WebService充当MQ消息的侦听器?

    也许我找错了方向 但我有一组服务 WebAPI 和 WCF 它们使用 WebSphere MQ 与其他系统交互 这没有问题 直到我现在需要找到一种方法listening对于队列之一上的消息 这是否可能 或者我是否需要走 Windows 服务
  • Retrofit 2.0:无法为类创建调用适配器

    我正在使用 Retrofit 2 0 beta1 如何发出简单的同步请求并将 JSON 响应反序列化为 POJO 列表 这是我的界面 public interface ArticlesAPI GET articles List
  • Python递归挑战[已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在上Python和计算理论入门课 最近期中考试中有一道难题我根本无法解决 它涉及为添加数字的程序编写代码 我相信这个问题应该使
  • 通过 api 访问 Wikimedia Commons 上的版权信息

    我想使用 MediaWiki API 来获取图像的版权信息 当您单击维基百科中的图像时 将打开包含该图像的页面 其中包含 更多详细信息 按钮 单击此按钮 您将进入一个包含 在网络上使用此文件 链接的页面 单击此链接 运行脚本 stockPh
  • C# 中析构函数有必要吗?

    我有一个担忧 我是计算机科学专业的一年级学生 通常我在课堂上很好奇 但老师并不总是有答案 或者并不总是知道答案 C 中析构函数有必要吗 我的意思是 如果我必须像通常对构造函数那样实现析构函数方法 这是一个好的做法还是我可以避免它并且垃圾收集
  • macOS 钥匙串 ACL 如何确定哪些应用程序具有访问权限?

    当应用程序将项目保存到钥匙串时 macOS 会将该应用程序添加到访问控制列表中 以便您的应用程序稍后可以访问它 如果您尝试从其他应用程序访问该项目 macOS 将显示系统提示 询问用户是否允许访问 这是有记录的here https deve
  • sockaddr_in 未声明的标识符

    我正在遵循 beej 的网络指南 进展非常顺利 因为我对一切都很了解 而且他解释得很好 然而 当我想测试他向我展示的一些很酷的东西时 这是行不通的 我不确定 sockaddr in 到底在哪里声明 但也许这里有人会帮助我 这是我到目前为止所
  • Office 文档提示登录匿名 SharePoint 网站

    我有一个配置为匿名访问的 MOSS 07 站点 该站点内有一个文档库 也启用了匿名访问 当匿名用户单击该库中的 PDF 文件时 他或她可以毫无问题地阅读或下载该文件 当用户单击 Office 文档时 系统会提示他或她登录框 用户可以在不登录
  • 内联 MSIL/CIL

    我创建了以下简单方法 public static void Main Console WriteLine Hello world Console ReadKey true 然后我使用ILSpy获取MSIL代码 method public h
  • System.InvalidOperationException:无法解析类型依赖注入.net core web api的服务

    System InvalidOperationException 尝试激活 Pwc EMSWebapi UserManagementController 时无法解析类型 Pwc EMSWebapi IUserManagementServic
  • 如何从一组用户中提取电子邮件

    If I do User all pluck email 然后就可以正常工作了 但如果我这样做 arr Array new arr User all and then arr pluck email 这引发了以下错误 undefined m
  • 重写构造函数类

    下面是我的代码 我不明白这是什么错误 有谁可以指导一下吗 class State static String country static String capital State Constructor country America s
  • 连接两个向量同时转换一个向量的元素的最佳方法是什么?

    假设我有 std vector
  • wget:无法解析主机地址“github.com”

    我正在使用 Redhat UBI 映像构建 dockerfile 当我构建映像时 我得到 wget 无法解析主机地址 github com 我尝试添加一个不以 GitHub 开头的不同 URL 但该 URL 有效 不确定是什么问题 以下是我
  • NSFetchedResultsController 在 objectAtIndexPath 上崩溃?

    我在尝试访问以下对象时发生崩溃NSFetchedResultsController 2013 11 10 15 15 06 568 Social 11503 70b CoreData error Serious application er
  • 在 C#.NET 中动态转换为类型

    替代标题 在运行时动态转换为类型 我想将对象转换为将在运行时分配的类型 例如 假设我有一个分配字符串值的函数 来自TextBox or Dropdownlist to an Object Property 我如何将值转换为正确的类型 例如
  • 如何设置包装给定函数的函数的类型

    我正在做一个简单的memoize函数 它的作用是接受一个函数 并在缓存返回结果的地方做一些魔法 但基本上返回函数的类型memoize与给定的完全相同 但我遇到了错误 我不知道如何修复 当使用该函数并忽略我遇到的错误时 这些类型可以工作 我已