Typescript-在子类上强制覆盖静态变量

时间:2018-06-29 07:54:36

标签: javascript typescript inheritance static abstract

我有一个带有静态变量的A类 我想强制A类的每个子类覆盖此静态变量 具有一些唯一的ID。

有可能吗? 因为我们可以强制子类重写某些函数/变量的原因是使用abstract关键字,但是static如何与abtract一起工作。

以下代码将起作用-但我不能强迫子类重写...

abstract class A {
    protected static _id: string;
    abstract setStaticProp(): void;
}

class B extends A {
    protected static id= 'test';
}

有什么主意吗?

1 个答案:

答案 0 :(得分:1)

如果您在派生类中寻找必需的静态属性(也称为静态抽象属性),则对此不提供语言支持。对于here之类的东西有一个建议的功能,但尚不清楚是否会实现。

如果将A设为私有,则仅导出类型(而不是类本身),并且还导出将需要字段并返回继承自B的类的函数从。您可以实现某种安全措施:

// The actual class implementation
abstract class _A {
    public static status_id: string;
}
export type A = typeof _A; // Export so people can use the base type for variables but not derive it
// Function used to extend the _A class
export function A(mandatory: { status_id : string})  {
    return class extends _A {
        static status_id = mandatory.status_id
    }
}

// In another module _A is not accessible, but the type A and the function A are
// to derive _A we need to pass the required static fields to the A function
class B extends A({ status_id: 'test' }) {

}

console.log(B.status_id);

注意

从代码中尚不清楚,在标题中您说的是静态字段,但没有将status_id字段声明为static。如果只希望在派生类中需要一个实例字段,则可以在该字段上使用abstract关键字:

abstract class A {
    public abstract status_id: string;
}

class B extends A  {
    status_id = "test" // error if missing
}