Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
476 views
in Technique[技术] by (71.8m points)

error handling - TypeScript: How to set a const variable in a try block?

I want to declare a const variable, initialize it inside a try block, and then use it outside of that try block. For example:

const result;

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

use(result);

Or asynchronously:

const result;

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

use(result);

What I don't want:

  • Use let because that allows overwriting the result later on.
  • Move this to a separate function because I only want this logic to be accessible inside the given scope.

I'm seeing this pattern a lot in my code, so is there any way to do this using a modular TypeScript solution?

The following questions are similar, but don't provide a reusable type-safe solution:


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Synchronous solution

Use the following type-safe utility function:

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,
        };
    }
}

Usage:

const result = tryGet(getValue);

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

use(result.value);

Asynchronous solution

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,
        };
    }
}

Usage:

const result = await tryGetAsync(fetchValue);

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

use(result.value);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...