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

TypeScript中父类如何访问子类定义的属性?

问题结论

可以实现,需要根据你的使用场景调整属性定义方式即可,核心是利用JS类的this指向规则和属性初始化逻辑。


适配你当前的静态方法调用场景

你现在调用的是Product.getAll()静态方法,父类静态方法中的this默认指向调用它的类(也就是子类Product),只需要把子类的table改为静态属性即可:

修改后的父类代码

class Model{
    constructor() {
        // 实例场景的用法后面说明
    }  
    public static getAll(){
        // 此处this指向调用该方法的子类,可直接取子类静态属性
        return `操作表:${this.table},返回所有数据`;
    }
}
export default Model;

修改后的子类代码

import Model from "../providers/Model";
class Product extends Model{
    // 改为静态属性,供给父类静态方法访问
    public static table = "products";
}
export default Product;

修改后调用Product.getAll()即可正常拿到子类定义的表名。


父类构造器/实例方法访问子类表名的场景

如果你需要在父类的构造器或者实例方法中访问表名,要注意:子类的普通实例属性默认在父类构造器执行完毕后才会初始化,直接在父类构造器读this.table会得到undefined,有两种通用解决方法:

  • 方法1:子类构造器先赋值再调用super
class Product extends Model{
    constructor() {
        this.table = "products";
        // 赋值完成后再执行父类构造逻辑
        super();
    }
}
  • 方法2:将table定义为getter
class Product extends Model{
    get table() {
        return "products";
    }
}

两种方法都可以让你在父类构造器和实例方法中直接通过this.table拿到值。


同时支持静态调用和实例使用的完整示例

如果需要同时适配两种场景,可以同时定义静态属性和实例getter做兼容:

// 父类
class Model{
    constructor() {
        console.log('构造器获取表名:', this.table)
    }
    // 实例方法
    getTableName() {
        return this.table
    }
    // 静态方法
    public static getAll(){
        return `操作表:${this.table},查询所有数据`;
    }
}

// 子类
class Product extends Model{
    // 静态属性给静态方法调用
    public static table = "products";
    // getter给实例场景调用
    get table() {
        return Product.table;
    }
}

// 测试
console.log(Product.getAll()) // 输出:操作表:products,查询所有数据
const productIns = new Product()
console.log(productIns.getTableName()) // 输出:products

内容的提问来源于stack exchange,提问作者Sarower Jahan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 03:06:04