האם ניתן לבצע שרשור הבטחות פונקציונלי עם TypeScript?


נראה שב-JavaScript ניתן לעשות:

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

אבל אם אני מוסיף סוגים, כמו

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

אז קומפיילר 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>'.

למה Promise<void> לא נחשב ל-PromiseLike?

תשובה #1

קוד ה-JavaScript שלך אינו בדיוק כפי שהוא צריך להיראות. הטיעון של Promise.then() חייב להיות פונקציה, לא Promise.

פונקציה זו יכולה להחזיר Promise חדש, void או ערך (שאינו Promise) שמשמש לפתרון ה-Promise ששיטה .then() שלו נקראה. ככל הנראה, בקוד שלך היא חייבת להחזיר Promise חדש.

הקוד הנכון ב-JavaScript הוא:

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

והקוד המקביל ב-TypeScript הוא:

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