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
letfordi det lar deg overskriveresultsenere. - 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);
