【问题标题】:Why doesn't typescript complain when I DON'T return a Promise in an async function当我不在异步函数中返回 Promise 时,为什么打字稿不抱怨
【发布时间】:2022-10-15 21:15:59
【问题描述】:

我有一个async 函数,我打算返回一个MyResponseType 类型的对象。据我了解,async 函数必须返回Promise,因此我创建了以下内容:

import mongoose from 'mongoose'
import MyModel from './models/MyModel'
import { MyResponseType } from "../common/types";

const myFunc = async (
  title: string,
  text?: string
): Promise<MyResponseType> => {
  const result = await MyModel.create({
    title,
    text,
  });
  return {
    message: 'Success',
    result
  };
};

我的问题是:

  1. 这是从async 函数返回的正确方法,假设我希望在调用者调用await myFunc({...}) 时结果处于resolved 状态?

  2. 为什么打字稿不抱怨返回类型是MyResponseType,即使它期待Promise&lt;MyResponseType&gt;?是否正在进行一些隐式转换?

【问题讨论】:

  • async 函数的返回值总是包装在 Promise 中。

标签: typescript async-await promise


【解决方案1】:
  1. 这是从async 函数返回的正确方法,假设我希望调用者调用await myFunc({...}) 时结果处于已解决状态?

    是的。 (但这是一个完成状态,而不是[只是]一个解决状态。更多关于承诺术语in my blog post.)

    1. 为什么打字稿不抱怨返回类型是MyResponseType,即使它期待Promise&lt;MyResponseType&gt;?是否正在进行一些隐式转换?

    不是转换,但是,是的,一些隐含的东西。 async 函数是 promise 创建和消费的语法糖。他们总是回报承诺。您使用return ___ 提供的值是履行价值用于履行他们创造的隐含承诺。

    在您的示例中,myFunc 同步运行,直到它调用 MyModel.create;一旦它得到来自create 的promise,它就会将它传递给await 并且该函数创建并返回它自己的promise。稍后,异步地,当来自create 的承诺是落户,发生以下两种情况之一:

    • 如果来自create 的承诺是完成myFunc 的逻辑继续,在这种情况下,用您提供给return 的对象履行来自myFunc 的承诺。

    • 如果来自create 的承诺是被拒绝,您的函数的承诺被拒绝,拒绝原因是create 提供的承诺。

    (那是轻微地简化了,但这里不需要血淋淋的细节。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 2022-01-16
    • 2016-05-22
    • 1970-01-01
    • 2018-10-14
    • 2018-07-14
    相关资源
    最近更新 更多