TypeScript是否可以实现功能承诺链接?

feu*_*ene 1 typescript

似乎在JavaScript中可以做到:

function extendPromise(promise) {
    return promise.then(new Promise(() => {}));
}
Run Code Online (Sandbox Code Playgroud)

但是如果我添加类型,比如

function extendTypeScriptPromise(promise: Promise<void>) {
    return promise.then(new Promise<void>(() => {}));
}
Run Code Online (Sandbox Code Playgroud)

然后TypeScript编译器说:

error TS2345: Argument of type 'Promise<void>' is not assignable to parameter of type '((value: void) => void | PromiseLike<void>) | null | undefined'.
  Type 'Promise<void>' is not assignable to type '(value: void) => void | PromiseLike<void>'.
    Type 'Promise<void>' provides no match for the signature '(value: void): void | PromiseLike<void>'.
Run Code Online (Sandbox Code Playgroud)

为什么不Promise<void>考虑PromiseLike

axi*_*iac 11

你的JavaScript代码不太像它应该是什么样子.的参数Promise.then()必须是一个函数,而不是一个Promise.

此功能可以返回一个新的Promise,void或值(即不是Promise),用于解决Promise.then()方法被调用.显然,在你的代码中它必须返回一个新的Promise.

正确的JavaScript代码是:

function extendPromise(promise) {
    return promise.then(() => new Promise(() => {}));
}
Run Code Online (Sandbox Code Playgroud)

和相应的TypeScript代码是:

function extendTypeScriptPromise(promise: Promise<void>) {
    return promise.then(() => new Promise<void>(() => {}));
}
Run Code Online (Sandbox Code Playgroud)