Typescript Общий тип возврата обещания - PullRequest
0 голосов
/ 23 ноября 2018

В основном я пытаюсь реализовать функцию, которая всегда возвращает выполненное обещание того же самого "типа", который я передаю функции в качестве параметра

Так что, если я вызываю с логическим значением, он возвращает выполненное обещание, если я вызываю строковый параметр, он возвращает выполненное обещание и т. д.

то, что я пробовал до сих пор:

const PromiseOK = <T>(val: T): Promise<T> => {
    return Promise.resolve(val);
};

Я не знаю, является ли это правильным способомсделайте это, и в любом случае он сломается, если я попытаюсь получить обещание

Любое предложение будет оценено

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Ваша реализация выглядит нормально, проблема с void заключается в том, что параметр все еще ожидается.Вы можете вызвать его с помощью undefined

const PromiseOK = <T>(val: T): Promise<T> => {
    return Promise.resolve(val);
};

PromiseOK<void>(undefined)

Лучшим вариантом может быть использование перегрузок для получения особого поведения для void:

function PromiseOK(): Promise<void>
function PromiseOK<T>(val: T): Promise<T>
function PromiseOK<T>(val?: T): Promise<T> {
    return Promise.resolve(val);
};

PromiseOK() // Promise<void>
PromiseOK(1) //Promise<number>

Возможны перегрузки с помощью функций стрелок, но синтаксис не совсем красивый:

const PromiseOK: {
    (): Promise<void>
    <T>(val: T): Promise<T>
} = <T>(val?: T): Promise<T> => Promise.resolve(val);

PromiseOK() // Promise<void>
PromiseOK(1) //Promise<number>
0 голосов
/ 23 ноября 2018

Это должно выглядеть следующим образом

function PromiseOK<T>(val: T): Promise<T> {
    return Promise.resolve(val);
};

Если вы хотите сохранить жирную стрелку, то

const PromiseOK = <T extends any>(val: T): Promise<T> => {
    return Promise.resolve(val);
};

Запись T extends any также поддерживает void.

...