You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript继承类时无法正确赋值类变量的问题求助

自定义Error子类时type属性为undefined的问题解决

核心问题分析

你的代码存在两个关键问题:

  1. 自定义类名使用了Error,和JavaScript全局内置的Error类冲突,导致继承逻辑出现异常。
  2. 父类构造函数存在逻辑漏洞,没有正确处理type参数或属性赋值。

方案1的问题拆解

  1. 类名冲突:自定义Error类覆盖了全局内置类,导致继承行为不符合预期。
  2. 变量引用错误:父类构造函数中的type == undefined引用的是未定义的变量(既不是this.type也不是函数参数),所以会直接执行this.type = 'Uncaught'。
  3. 属性初始化顺序:子类的type = 'LexerError'属于实例属性,会在父类构造函数执行之后才初始化,所以构造函数里的console.log会先打印Uncaught,但类名冲突会破坏这个逻辑,最终导致type变为undefined。

方案2的问题拆解

  1. 同样存在类名冲突:自定义Error类覆盖全局类,继承逻辑异常。
  2. 参数未赋值:父类构造函数仅在参数为undefined时设置默认值,传入LexerError时没有将参数赋值给this.type,导致this.type始终未被初始化,最终为undefined。

正确实现方式

步骤1:避免类名冲突

将自定义父类命名为BaseError(或其他非内置类名),避免覆盖全局Error。

步骤2:完善父类构造函数逻辑

确保无论是否传入type参数,都正确赋值给this.type,同时设置默认值。

最终代码

class BaseError {
    type: string; // 去掉可选标记,构造函数会确保属性有值

    constructor(type?: string) {
        // 传入type则使用,否则用默认值
        this.type = type ?? 'Uncaught';
        console.log(this.type);
    }
}

class LexerErr extends BaseError {
    // 方案A:通过构造函数传参(推荐)
    constructor() {
        super('LexerError');
    }

    // 方案B:直接在类体定义属性(子类属性会覆盖父类构造函数的赋值)
    // type = 'LexerError';
    // constructor() {
    //     super(); // 不传参数,父类设为'Uncaught',子类属性初始化后会覆盖
    // }
}

const err = new LexerErr();
console.log(err.type); // 输出 'LexerError'

代码解释

  • 类名改为BaseError后,继承逻辑正常工作,不会和全局类冲突。
  • 父类构造函数使用??空值合并运算符,简洁处理默认值,确保this.type始终有值。
  • 子类通过super('LexerError')传递参数,父类直接赋值给this.type,最终实例的type正确设置为LexerError。

内容的提问来源于stack exchange,提问作者0minutes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:13:26