Код: Выделить всё
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)
);
}
}
Код: Выделить всё
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
Я попробовал с этим:
Код: Выделить всё
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