Last active
December 9, 2021 19:38
-
-
Save MatthewEppelsheimer/892b8af018e37bdbbfae549c0fe87a00 to your computer and use it in GitHub Desktop.
TypeScript function to extract message from an error of unknown type, useful in catch blocks UNTESTED
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Detect type of caught error and return its message, optionally running type-specific callbacks | |
* | |
* @example | |
* catch (err) { | |
* const { message } = parseCaughtError(err); | |
* console.log(message); | |
* } | |
* | |
* @NOTE Returns an option, to ease iterating to return other properties when needed e.g. stack | |
* | |
* @param error Error of unknown type to parse | |
* @param cbs Optional object with callbacks to invoke depending on detected type | |
* | |
* @return Object with extracted properties from the error | |
*/ | |
function parseCaughtError( | |
error: unknown, | |
cbs?: { | |
typeString?: (error: string) => void; | |
// tslint:disable-next-line:ban-types | |
typeStringClass?: (error: String, message: string) => void; | |
typeErrorClass?: (error: Error, message: string) => void; | |
typeObject?: (error: object, message: string) => void; | |
} | |
): { message: string } { | |
let message: string | undefined = 'Unknown error occurred'; | |
if (error !== null && error !== undefined) { | |
if (typeof error === 'string') { | |
message = error; | |
cbs?.typeString !== undefined && cbs.typeString(error); | |
} else if (error instanceof String) { | |
message = error.toString(); | |
cbs?.typeStringClass !== undefined && cbs.typeStringClass(error, message); | |
} else if (error instanceof Error) { | |
message = error.message; | |
cbs?.typeErrorClass !== undefined && cbs.typeErrorClass(error, message); | |
} else if (typeof error === 'object') { | |
const errObj = error as { | |
[prop: string]: { toString: () => string }; | |
}; | |
message = errObj.message?.toString(); | |
cbs?.typeObject !== undefined && cbs.typeObject(error, message); | |
} | |
} | |
return { message }; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Iterates on some work from Dan Story.
Untested.