feilhåndtering - TypeScript: Hvordan sette en const-variabel i en try-blokk?


Jeg vil erklære en const-variabel, initialisere den inne i en try-blokk, og deretter bruke den utenfor den try-blokken. For eksempel:

const result;

try {
    result = getResult();
} catch (error) {
    report(error);
    return;
}

use(result);

Eller asynkront:

const result;

try {
    result = await fetchResult();
} catch (error) {
    report(error);
    return;
}

use(result);

Hva jeg ikke vil ha:

  • Bruk let fordi det lar deg overskrive result senere.
  • Flytt dette til en egen funksjon fordi jeg bare vil at denne logikken skal være tilgjengelig inne i det gitte området.

Jeg ser dette mønsteret mye i koden min, så finnes det en måte å gjøre dette på ved å bruke en modulær TypeScript-løsning?

Følgende spørsmål er like, men gir ikke en gjenbrukbar type-sikker løsning:

  • hvordan bruke const i try catch-blokk
  • Javascript sett const-variabel inne i en try-blokk

Svar #1

Synkron løsning

Bruk følgende typesikre hjelpefunksjon:

function tryGet<T>(getter: () => T): {
    success: true;
    value: T;
} | {
    success: false;
    error: Error;
} {
    try {
        return {
            success: true,
            value: getter(),
        };
    } catch (error) {
        return {
            success: false,
            error: error as Error,
        };
    }
}

Bruk:

import { report, use } from './imagination';

const result = tryGet(getValue);

if (!result.success) {
    report(result.error);
    return;
}

use(result.value);

Asynkron løsning

export default async function tryGetAsync<T>(
    getter: () => Promise<T>
): Promise<{
    success: true;
    result: T;
} | {
    success: false;
    error: Error;
}> {
    try {
        return {
            success: true,
            result: await getter(),
        };
    } catch (error) {
        return {
            success: false,
            error: error as Error,
        };
    }
}

Bruk:

import { report, use } from './imagination';

const result = await tryGetAsync(fetchValue);

if (!result.success) {
    report(result.error);
    return;
}

use(result.value);

Relaterte artikler