Оберните функцию, возвращаемое значение которой Promise <T>| не определено, чтобы всегда возвращать Promise и продолжать печатать - PullRequest
1 голос
/ 28 февраля 2020

У меня есть функция callback<T>, возвращаемое значение которой Promise<T> или undefined. Теперь я хочу создать функцию обтекания, которая будет выполнять функцию и всегда будет возвращать Обещание - в случае, если функция обратного вызова вернула undefined, Обещание должно разрешиться с undefined.

Код не является проблема, но поддержание вывода типа в Typescript. Как должна выглядеть сигнатура функции для поддержания набора текста?

(нерабочий) пример:

function wrap<T>(callback: () => Promise<T> | undefined): Promise<T> | Promise<undefined>

// inferred signature should be Promise<undefined>
const a = wrap(() => undefined)

// inferred signature should be Promise<number>
const b = wrap(() => Promise.resolve(5))

1 Ответ

2 голосов
/ 28 февраля 2020

Моя первая мысль - перегрузка функции:

function wrap<T>(callback: () => Promise<T>): Promise<T>;
function wrap(callback: () => undefined): Promise<undefined>;
function wrap<T>(callback: () => any): Promise<T | undefined> {
    const result = callback();
    if (typeof result === "undefined") {
        return Promise.resolve(undefined);
    }
    return result;
}

Live на игровой площадке

Это также можно выразить в виде типа, если это полезно:

type Wrapper = {
    <T>(callback: () => Promise<T>): Promise<T>;
    (callback: () => undefined): Promise<undefined>;
}

const wrap: Wrapper = (callback: () => any) {
    const result = callback();
    if (typeof result === "undefined") {
        return Promise.resolve(undefined);
    }
    return result;
};

на детской площадке

...