diff --git a/ts/util/missingCaseError.ts b/ts/util/missingCaseError.ts index d8bb2bb49952..a4876bec405d 100644 --- a/ts/util/missingCaseError.ts +++ b/ts/util/missingCaseError.ts @@ -1,6 +1,17 @@ // Copyright 2018-2020 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only +const stringify = (value: unknown): string => { + try { + // `JSON.stringify` can return `undefined` (TypeScript has incorrect types here). + // However, this is fine because we interpolate it into a string, so it shows up as + // "undefined" in the final error message. + return JSON.stringify(value); + } catch (err) { + return Object.prototype.toString.call(value); + } +}; + // `missingCaseError` is useful for compile-time checking that all `case`s in // a `switch` statement have been handled, e.g. // @@ -21,4 +32,4 @@ // handled by our `switch` / `case` statement which is useful for code // maintenance and system evolution. export const missingCaseError = (x: never): TypeError => - new TypeError(`Unhandled case: ${x}`); + new TypeError(`Unhandled case: ${stringify(x)}`);