CoderAnswer - 程序员编程问答

TypeScript中的等待类型

by @Remco Haszing

typescript async-await

我在JavaScript中使用异步/等待很多。现在我逐渐将我的代码库的某些部分转换为TypeScript。

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

输入Awaitable <T> = T |许<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)})

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

我真的不相信这种类型没有内置,但我找不到。 TypeScript是否具有内置的等待类型?


2个答案

0 by @Hitmands
  1. async/await将始终将语句包装到promise中,因此您的函数将始终返回promise。
  2. 无论是否异步,都可以等待所有内容,因此自定义Awaitable类型可能只是冗余...

<!-- language: lang-js -->

async function test() {
    const foo = await 5;
    console.log(foo);

    const bar = await 'Hello World';
    console.log(bar);

    const foobar = await Promise.resolve('really async');
    console.log(foobar);
}

test();

<!-- end snippet -->

Link to the ts playground

您不需要额外输入imho,因为您的函数将始终具有:

<!-- language: lang-js -->

async function foo<T>(task: () => T | Promise<T>): Promise<T> {
  const result = await task();

  return result;
}

<!-- end snippet -->

0 by @T.J. Crowder

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

lib.es5.d.ts和[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>;
}

lib.es5.d.ts中没有像Awaitable那样定义PromiseLikePromise

我想如果他们定义了一个,他们会在那些定义中使用它。

附注:基于这些定义,在Awaitable中使用PromiseLike而不是Promise可能是有意义的:

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

相关问题