/** | |
* Used to create Error subclasses until the community moves away from ES5. | |
* | |
* This is because compiling from TypeScript down to ES5 has issues with subclassing Errors | |
* as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123 | |
* | |
* @param createImpl A factory function to create the actual constructor implementation. The returned | |
* function should be a named function that calls `_super` internally. | |
*/ | |
export function createErrorClass<T>(createImpl: (_super: any) => any): T { | |
const _super = (instance: any) => { | |
Error.call(instance); | |
instance.stack = new Error().stack; | |
}; | |
const ctorFunc = createImpl(_super); | |
ctorFunc.prototype = Object.create(Error.prototype); | |
ctorFunc.prototype.constructor = ctorFunc; | |
return ctorFunc; | |
} | |