Är funktionell löfteskedjning möjlig med TypeScript?


Det verkar som att man i JavaScript kan göra:

function extendPromise(promise) {
    return promise.then(new Promise(() => {}));
}

Men om jag lägger till typer, som

function extendTypeScriptPromise(promise: Promise<void>) {
    return promise.then(new Promise<void>(() => {}));
}

då säger TypeScript-kompilatorn:

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>'.

Varför anses inte en Promise<void> vara PromiseLike?

Svar #1

Din JavaScript-kod ser inte riktigt ut som den borde. Argumentet till Promise.then() måste vara en funktion, inte ett Promise.

Denna funktion kan returnera en ny Promise, void eller ett värde (som inte är en Promise) som används för att lösa Promise vars .then() metod kallas. Tydligen måste den i din kod returnera en ny Promise.

Den korrekta JavaScript-koden är:

function extendPromise(promise) {
    return promise.then(() => new Promise(() => {}));
}

och den motsvarande TypeScript-koden är:

function extendTypeScriptPromise(promise: Promise<void>) {
    return promise.then(() => new Promise<void>(() => {}));
}