I would like to extend the host object Error
to a custom UploadError
class. The following example fails when I compile:
class UploadError extends Error {
constructor(message: string, private code: number) {
super(message);
}
getCode(): number {
return this.code;
}
}
When I run the TypeScript compiler tsc
I get the following error:
UploadError.ts(1,0): A export class may only extend other classes, Error is an interface.
It seems Error
is defined as an interface. If anyone knows what the name of the implementation is it would make me very happy :-)
Update: I want to use Typescripts inheritance not prototypical inheritance like I currently employ to hack around this:
function UploadError (message: string, code: number) {
this.message = message;
this.code = code;
}
UploadError.prototype = new Error();
UploadError.prototype.constructor = UploadError;
UploadError.prototype.getCode = (): number => {
return this.code;
}
Update
TypeScript 1.6 is bringing the ability to extend native types, so when this lands you should be able to use
Original Answer
You can implement the error interface in TypeScript, but this won't give you access to
super
as you aren't using inheritance:Update for TypeScript 1.6:
It's now possible to directly extend from the
Error
class, the code in my original answer still works, but there's no longer a need for theexport declare class Error
.Original answer:
Most of the answers here don't meet my requirements. The originally accepted answer doesn't compile anymore since 0.9.5 with a duplicate identifier exception. And non of them really have a stack trace (a JavaScript issue, not TypeScript).
For me a more elegant solution is:
What you can do with it:
new Exception("msg") instanceof Error == true
class SpecificException extends Exception
catch (e) { console.log(e.stack); }
The only limitation I found was that you have to declare it in a module, and cannot make them global. For me this isn't an issue since I think a module helps in structuring, and they are there in any application I make.
One improvement you could make is strip your custom code from the stack trace, personally I think stacktraces are only for the eyes of developers, and they know where to look, so it's no big deal for me.
I'm using TypeScript 1.8 but this may work for earlier versions:
Note that you must have the
node
typings installed in order to useError.captureStackTrace
.Ron Buckton's solution worked for me when using TypeScript 0.8.3, but it does not compile in TypeScript 0.9.5. TypeScript generate compilation error: Duplicate identifier 'ErrorClass'. I have changed the code to make it work again:
Extending interfaces is a breaking change documented here.
Solution: change manually prototype in your constructor.