如何在typescript中覆盖来自inehirted派生类的静态变量

时间:2015-08-17 18:14:35

标签: typescript

我希望静态方法的静态实现使用派生类的值。例如,在下面的简单示例中,当我调用User.findById()时,我希望它在执行基类SqlModel中定义的实现时使用重写的tableName User

如何确保基类static tableName使用' User'这是否是基本上声明抽象静态属性的正确方法?

class SqlModel {

    protected static tableName:string;

    protected _id:number;
    get id():number {
        return this._id;

    }

    constructor(){

    }

    public static findById(id:number) {
        return knex(tableName).where({id: id}).first();
    }

}

export class User extends SqlModel {

    static tableName = 'User';

    name:string;

    constructor(username){
        this.name = username;
    }
}

我会得到一个错误,说没有定义tablename,但是如果我说SqlModel.tableName那么它就不会使用派生类表名

User.findById(1); //should call the knex query with the tablename 'User'

2 个答案:

答案 0 :(得分:7)

您可以使用this.tableName

class SqlModel {
    protected static tableName: string;

    public static outputTableName() {
        console.log(this.tableName);
    }
}

class User extends SqlModel {
    protected static tableName = 'User';
}

User.outputTableName(); // outputs "User"

答案 1 :(得分:4)

我设法得到了这样的静态:

(<typeof SqlModel> this.constructor).tableName