首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在TypeScript中扩展主机对象(例如Error)

如何在TypeScript中扩展主机对象(例如Error)
EN

Stack Overflow用户
提问于 2012-10-16 21:07:33
回答 11查看 28.2K关注 0票数 45

我想将主机对象Error扩展到一个自定义的UploadError类。下面的示例在我编译时失败:

代码语言:javascript
运行
复制
class UploadError extends Error {
    constructor(message: string, private code: number) {
        super(message);
    }

    getCode(): number {
        return this.code;
    }
}

当我运行TypeScript编译器tsc时,我得到以下错误:

代码语言:javascript
运行
复制
UploadError.ts(1,0): A export class may only extend other classes, Error is an interface.

似乎Error被定义为一个接口。如果有人知道实现的名称,我会非常高兴:-)

更新:我想使用类型脚本继承,而不是我现在使用的原型继承来解决这个问题:

代码语言:javascript
运行
复制
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;
}
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-11-16 11:58:15

我发现以下方法是可行的:

代码语言:javascript
运行
复制
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);
    }
}

生成的脚本如下所示:

代码语言:javascript
运行
复制
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);
票数 10
EN

Stack Overflow用户

发布于 2014-03-26 23:39:53

TypeScript 1.6更新:

现在可以直接从Error类扩展,我原始答案中的代码仍然有效,但不再需要export declare class Error

原始答案:

这里的大多数答案都不符合我的要求。最初接受的答案从0.9.5开始不再编译,出现重复标识符异常。而且它们都没有真正的堆栈跟踪(一个JavaScript问题,而不是TypeScript)。

对我来说,一个更优雅的解决方案是:

代码语言:javascript
运行
复制
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); }

我发现的唯一限制是你必须在模块中声明它,并且不能使它们成为全局的。对我来说这不是问题,因为我认为模块有助于结构化,而且它们存在于我制作的任何应用程序中。

你可以做的一个改进是将你的自定义代码从堆栈跟踪中剥离出来,我个人认为堆栈跟踪只适用于开发人员的眼睛,他们知道去哪里看,所以对我来说没什么大不了的。

票数 34
EN

Stack Overflow用户

发布于 2016-12-14 22:08:13

关注TypeScript2.1- link中的新变化

因此您可以扩展Error类,但作为建议,您需要在任何超级(...)之后立即手动调整原型。呼叫:

代码语言:javascript
运行
复制
class FooError extends Error {
    constructor(m: string) {
        super(m);

        // Set the prototype explicitly.
        Object.setPrototypeOf(this, FooError.prototype);
    }

    sayHello() {
        return "hello " + this.message;
    }
}
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12915412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档