我想将主机对象Error
扩展到一个自定义的UploadError
类。下面的示例在我编译时失败:
class UploadError extends Error {
constructor(message: string, private code: number) {
super(message);
}
getCode(): number {
return this.code;
}
}
当我运行TypeScript编译器tsc
时,我得到以下错误:
UploadError.ts(1,0): A export class may only extend other classes, Error is an interface.
似乎Error
被定义为一个接口。如果有人知道实现的名称,我会非常高兴:-)
更新:我想使用类型脚本继承,而不是我现在使用的原型继承来解决这个问题:
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;
}
发布于 2012-11-16 11:58:15
我发现以下方法是可行的:
declare class ErrorClass implements Error {
public name: string;
public message: string;
constructor(message?: string);
}
var ErrorClass = Error;
class MyError extends ErrorClass {
public name = "MyError";
constructor (public message?: string) {
super(message);
}
}
生成的脚本如下所示:
var ErrorClass = Error;
var MyError = (function (_super) {
__extends(MyError, _super);
function MyError(message) {
_super.call(this, message);
this.message = message;
this.name = "MyError";
}
return MyError;
})(ErrorClass);
发布于 2014-03-26 23:39:53
TypeScript 1.6更新:
现在可以直接从Error
类扩展,我原始答案中的代码仍然有效,但不再需要export declare class Error
。
原始答案:
这里的大多数答案都不符合我的要求。最初接受的答案从0.9.5开始不再编译,出现重复标识符异常。而且它们都没有真正的堆栈跟踪(一个JavaScript问题,而不是TypeScript)。
对我来说,一个更优雅的解决方案是:
module YourModule {
export declare class Error {
public name: string;
public message: string;
public stack: string;
constructor(message?: string);
}
export class Exception extends Error {
constructor(public message: string) {
super(message);
this.name = 'Exception';
this.message = message;
this.stack = (<any>new Error()).stack;
}
toString() {
return this.name + ': ' + this.message;
}
}
}
你可以用它做什么:
new Exception("msg") instanceof Error == true
class SpecificException extends Exception
catch (e) { console.log(e.stack); }
我发现的唯一限制是你必须在模块中声明它,并且不能使它们成为全局的。对我来说这不是问题,因为我认为模块有助于结构化,而且它们存在于我制作的任何应用程序中。
你可以做的一个改进是将你的自定义代码从堆栈跟踪中剥离出来,我个人认为堆栈跟踪只适用于开发人员的眼睛,他们知道去哪里看,所以对我来说没什么大不了的。
发布于 2016-12-14 22:08:13
关注TypeScript2.1- link中的新变化
因此您可以扩展Error类,但作为建议,您需要在任何超级(...)之后立即手动调整原型。呼叫:
class FooError extends Error {
constructor(m: string) {
super(m);
// Set the prototype explicitly.
Object.setPrototypeOf(this, FooError.prototype);
}
sayHello() {
return "hello " + this.message;
}
}
https://stackoverflow.com/questions/12915412
复制相似问题