【发布时间】:2019-05-14 19:37:48
【问题描述】:
我在 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)})
这行得通。但是,必须为我所有使用 async/await 和 TypeScript 的项目指定 Awaitable 很烦人。
我真的不敢相信这种类型不是内置的,但我找不到。 TypeScript 有内置的可等待类型吗?
【问题讨论】:
-
到底是什么问题?为什么需要在代码库的任何地方指定
Awaitable?无论您的函数返回T还是Promise<T>,您的函数都可以处理它 -
另外,
type Awaitable<T> = T | Promise<T>并没有那么复杂,在多个项目中编写它会有那么大的问题 -
@Aron 但是,如果您有多个返回行,则必须将每个同步值包装在一个 Promise 中,这还不错,但您不必这样做。
-
@Aron 这是添加到帖子中的内容。如果使用
Promise<T>作为签名,() => 42无效,但您可以在 typescript 中调用await 42。 -
@T.J.Crowder 我创建了一个issue