我在JavaScript中使用async /等待很多。现在,我逐渐将代码库的某些部分转换为TypeScript。
在某些情况下,我的函数接受将被调用并等待的函数。这意味着它可以返回一个promise,而只是一个同步值。我为此定义了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是否具有内置的等待类型?
答案 0 :(得分:1)
我相信这个问题的答案是:不,没有内置类型。
在lib.es5.d.ts
和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
中没有什么像您的lib.es5.d.ts
那样定义PromiseLike
和Promise
。
我想如果他们定义了一个,他们会在这些定义中使用它。
旁注:根据这些定义,在您的PromiseLike
中使用Promise
而不是Awaitable
可能是合理的:
type Awaitable<T> = T | PromiseLike<T>;
答案 1 :(得分:0)
async/await
总是会导致语句被包装为一个Promise,因此您的函数将始终返回一个Promise。Awaitable
类型可能只是多余的... 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();
您不需要额外的输入恕我直言,因为您的函数将始终具有:
async function foo<T>(task: () => T | Promise<T>): Promise<T> {
const result = await task();
return result;
}