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

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Вывода типа возвращаемого значения функции более высокого порядка, когда параметр функции возвращает обещание

Сообщение Anonymous »

В основном я пытаюсь создать функцию, определенную так: < /p>

Код: Выделить всё

function result(cb: () => T): Result {
try {
return Ok(fn());
} catch (error) {
return Err(
error instanceof Error ? (error as E) : (new Error(String(error)) as E)
);
}
}
Это функция, которая выполняет другую функцию, которая может добавить, например, json.parse , и соответственно возвращает ржаво-подобный результат, чтобы, например, Result (() = > Json.parse (...)) сбой. Прибытие, когда я пытаюсь сделать асинхронные вещи.

Код: Выделить всё

async function resultrAsync(
fn: () => Promise
): Promise {
try {
return Ok(await fn());
} catch (error) {
return Err(
error instanceof Error ? (error as E) : (new Error(String(error)) as E)
);
}
}
< /code>
Это следует использовать так: < /p>
const result = await resultAsync(() => fetch(...))< /code> < /p>
и он работает нормально.
Но я хочу переоценить вещи, присоединиться к этим двум функциям и сделать некоторую общую магию, чтобы справиться с случаями, когда функции обратного вызова синхронно или нет (JSON.parse
vs fetch )
Я попробовал с этим:

Код: Выделить всё

type SyncOrAsync = V | Promise;

function resultr(fn: () => V): Result;
function resultr(
fn: () => Promise
): Promise;
function resultr(
fn: () => SyncOrAsync
): SyncOrAsync {
try {
const result = fn();
if (result instanceof Promise) {
return result
.then(Ok)
.catch(error =>
Err(
error instanceof Error
? (error as E)
: (new Error(String(error)) as E)
)
) as Promise;
} else {
return Ok(result);
}
} catch (error) {
return Err(
error instanceof Error ? (error as E) : (new Error(String(error)) as E)
);
}
}
< /code>
Но когда я использую асинхронный вариант const res = result (() => fetch (url)) < /code>
его возвращаемый тип - результат  
Когда это должно быть обещание
Это возможно? Я знаю, что это, наверное, хорошая идея, но я хочу понять общие дженерики.

Подробнее здесь: https://stackoverflow.com/questions/794 ... er-returns
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»