TypeScript:静态属性和继承

时间:2016-06-09 17:18:41

标签: inheritance typescript static typescript1.8

我对TypeScript(1.8)很陌生,我对继承和静态属性有一个小问题。

请在下面找到我正在运行的测试代码:

class A {
    public static Items = {
        FOO: 'A'
    };

    public show() {
        alert(this.constructor.Items.FOO);
    }
} 

class B extends A {
    public static Items = {
        FOO: 'B'
    };
}

var a = new A();
var b = new B();

a.show(); // alert "A"
b.show(); // alert "B"

TypeScript Playground link

此代码运行正常,两个警报按预期显示。

但是 TypeScript编译器会抛出错误:Property "Items" does not exist on type "Function"

我理解警告并且从TypeScript的角度来看它完全正确,但是如何在使编译器满意的同时实现相同的结果? this.Items.FOO显然不起作用,我找不到self等价物或类似的东西......

我错过了什么吗?

提前致谢!

2 个答案:

答案 0 :(得分:5)

  

我理解警告,从TypeScript的角度来看,它完全正确

是的 - 这就像继承一样,但它并不是,并且通常不适用于您的静态属性。要解决此问题,请使用any禁用类型检查:

alert((<any>this.constructor).Items.FOO);

转换旧的js代码时经常会出现这种情况,但在编写新的TS代码时应该避免这种情况。如果你想要正确地执行此操作,您需要(正如您可能知道的那样)在两个类中实现并覆盖getItems或类似方法以返回相应的Items,并从{调用该方法{1}}。

答案 1 :(得分:4)

今天有一个类似的问题:Referencing class without name to use different static method in subclasses in TypeScript

this.constructor在此处返回正确类型的讨论/建议:T.constructor should be of type T

至于你现在可能的解决方案:

完全没有静电:

class A {
    public show() {
        alert(this.getItems().FOO);
    }

    protected getItems() {
        return {
            FOO: 'A'
        }
    };
}

class B extends A {
    protected getItems() {
        return {
            FOO: 'B'
        }
    }
}

code in playground

静态typeof

class A {
    public static Items = {
        FOO: 'A'
    };

    public show() {
        alert((<typeof A | typeof B> this.constructor).Items.FOO);
    }
}

code in playground

构造函数接口的静态:

interface AConstructor {
    new (): A;
    Items: any;
}

class A {
    public static Items = {
        FOO: 'A'
    };

    public show() {
        alert((this.constructor as AConstructor).Items.FOO);
    }
}

code in playground