TypeScript 中的可等待类型

2024-05-04

我在 JavaScript 中经常使用 async/await。现在我正在逐渐将代码库的某些部分转换为 TypeScript。

在某些情况下,我的函数接受将被调用和等待的函数。这意味着它可以返回一个承诺,只是一个同步值。我已经定义了Awaitable为此键入。

type Awaitable<T> = T | Promise<T>;

async function increment(getNumber: () => Awaitable<number>): Promise<number> {
  const num = await getNumber();
  return num + 1;
}

可以这样调用:

// logs 43
increment(() => 42).then(result => {console.log(result)})

// logs 43
increment(() => Promise.resolve(42)).then(result => {console.log(result)})

这有效。但是,必须指定很烦人Awaitable对于我所有使用 async/await 和 TypeScript 的项目。

我真的不敢相信这样的类型不是内置的,但我找不到。 TypeScript 有内置的可等待类型吗?


我相信这个问题的答案是:不,没有内置类型。

In lib.es5.d.ts https://github.com/microsoft/TypeScript/blob/eb2297df022f6b1f284aff96e93c06097bb01ea5/lib/lib.es5.d.ts and lib.es2015.promise.d.ts https://github.com/microsoft/TypeScript/blob/eb2297df022f6b1f284aff96e93c06097bb01ea5/lib/lib.es2015.promise.d.ts, 他们使用T | PromiseLike<T>对于您的各个地方Awaitable<T>是有道理的,例如:

/**
 * Represents the completion of an asynchronous operation
 */
interface Promise<T> {
    /**
     * Attaches callbacks for the resolution and/or rejection of the Promise.
     * @param onfulfilled The callback to execute when the Promise is resolved.
     * @param onrejected The callback to execute when the Promise is rejected.
     * @returns A Promise for the completion of which ever callback is executed.
     */
    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;

    /**
     * Attaches a callback for only the rejection of the Promise.
     * @param onrejected The callback to execute when the Promise is rejected.
     * @returns A Promise for the completion of the callback.
     */
    catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
}

没有什么像你的Awaitable in lib.es5.d.ts他们定义的地方PromiseLike and Promise.

我认为如果他们定义了一个,他们会在这些定义中使用它。

旁注:根据这些定义,使用可能是有意义的PromiseLike而不是Promise在你的Awaitable:

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

TypeScript 中的可等待类型 的相关文章

随机推荐

  • 制作 C# 项目 DLL 和 EXE

    我正在开发一个项目 需要有一个可执行文件以便用户可以运行配置界面和一个可以嵌入其他项目以使用其他一些功能的 DLL 有没有办法让 Visual Studio 同时生成可执行文件和 DLL 而不是每次都手动切换 我同意 TJMonk15 的观
  • 即使使用前向声明也会出现未定义的类型错误

    我正在阅读循环引用和前向声明 我确实知道在头文件中实现并不是一个好的设计实践 然而我正在尝试并且无法理解这种行为 使用以下代码 包含前向声明 我期望它能够构建 但是我收到此错误 Error 1 error C2027 use of unde
  • 如何避免JQuery和Prototype之间的冲突

    如果一个页面同时具有 JQuery 和 Prototype 那么我就会遇到冲突 有一个选项可以禁用 JQuery 的 符号 因此不会发生冲突 但是我必须使用关键字 JQuery 而不是 我想知道Prototype是否有任何选项可以解决这个冲
  • React-Router v4 渲染错误的组件但匹配正确

    我有一个带有两个按钮的侧边栏 测试 和 关于 Test 火箭图标 呈现在 test 处 About 主页图标 呈现在 处 它们都位于应用程序的根目录并嵌套在组件内 当我从 开始并单击 链接到 test 时 它总是加载 关于 组件 当我检查
  • 使用 iText 某些 pdf 文件水印不显示

    我们公司使用 iText 在一些 pdf 表格上标记一些水印文本 不是图像 我注意到 95 的表格可以正确显示水印 大约 5 则不能 我测试了一下 复制了2个原始pdf文件 一个被标记为ok 另一个不ok 然后通过一个小程序进行测试 结果相
  • 在透明背景的 flutter 上播放视频

    我在 Blender 上做了一些复杂的 3D 动画 我想在 flutter 上播放它们 问题是 当我将动画导出到视频并将其放在我的 flutter 应用程序上时 透明背景消失了 我使用 video player 在 flutter 上播放视
  • 在电子邮件中使用协议相对 URL 安全吗?

    关于在 HTML 中使用协议相对 URL 已有讨论 1 但是电子邮件呢 电子邮件客户端或 Gmail 等服务提供商在 HTML 电子邮件中使用时是否会删除或修改协议相对 URL 1 我可以将所有 http 链接更改为 吗 https sta
  • 如何在 R 中验证日期

    我有一个格式为的日期dd mm yyyy HH mm ss验证该日期的最佳和最简单的方法是什么 I tried d lt format Date date format d m Y H M S 但是当非法日期过去时如何捕获错误呢 简单的方法
  • 如何在 O(n) 时间内遍历二叉树而不需要额外的内存

    给定一棵带有整数 左指针和右指针的二叉树 如何在 O n 时间和 O 1 额外内存 无堆栈 队列 递归 内遍历该树 This guy http nandacumar blogspot com 2006 06 traversing tree
  • 为什么以下带有循环泛型的代码无法编译?

    以下是我的代码 class A
  • MVC 4 RC - Aspnet_regsql.exe

    我正在尝试使用 MVC 4 RC 默认模板启用登录 我以与 MVC 3 中相同的方式进行操作 Aspnet regsql exe gt SQL 服务器 然后我让连接字符串指向 SQL 服务器 当我尝试注册新用户时 我得到以下信息 Serve
  • Matlab 的快速 JSON 解析器

    您知道 Matlab 中有一个非常快速的 JSON 解析器吗 目前我正在使用JSONlab http www mathworks com matlabcentral fileexchange 33381 jsonlab a toolbox
  • 安装轮子后安装后脚本

    Using from setuptools command install import install 如果我运行 我可以轻松运行自定义安装后脚本python setup py install 这是相当微不足道 https stackov
  • 学习 WPF 会提高我的 ASP.NET 技能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经在 Windows 窗体领域工作了很多年 而且仍然如此 我完全不熟悉 ASP NET 技术 也不熟悉其他 Web 相关技术 我曾合作过 O
  • 使用 Python/PyGObject 在 Windows 中加载 GTK-Glade 翻译

    我有一个 Python 脚本 可以加载可翻译的 Glade GUI 在 Linux 下一切工作正常 但我在理解 Windows 上的必要步骤时遇到了很多困难 Linux 下似乎需要的只是 import locale locale setlo
  • 你如何处理冗余代码?

    我有一个类 它是代码库项目的一部分 该项目是为不再需要的特定目的而编写的 所以问题是你如何处理这样的代码 您是否简单地删除它 或者您是否记住它 未来的开发人员可能会遇到它 但没有意识到他们可以忽略它 或者您是否有某种存档系统 是否存在公认的
  • 捕获通信异常而不是自定义故障异常 - WCF

    在服务器上我抛出这样的异常 catch SqlException exception if exception Message Contains Custom error from stored proc Exception to be t
  • 使用map或reduce或filter,在Scheme中,计算列表中有多少个元素[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 number length 1 1 0 1 0 0 这假设返回 6 我知道如何使用长度并找到它 但我不知道如何在没有长度的情况下使用映射或过
  • List.Except 不起作用

    我尝试减去 2 个列表 如下代码所示 assignUsers已获得 3 条记录assignedUsers有 2 行 后Except方法我仍然得到 3 行 尽管我应该得到 1 条记录 因为 2 行assignedUsers类似于assignU
  • TypeScript 中的可等待类型

    我在 JavaScript 中经常使用 async await 现在我正在逐渐将代码库的某些部分转换为 TypeScript 在某些情况下 我的函数接受将被调用和等待的函数 这意味着它可以返回一个承诺 只是一个同步值 我已经定义了Await