我对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编译器会抛出错误:Property "Items" does not exist on type "Function"
我理解警告并且从TypeScript的角度来看它完全正确,但是如何在使编译器满意的同时实现相同的结果? this.Items.FOO
显然不起作用,我找不到self
等价物或类似的东西......
我错过了什么吗?
提前致谢!
答案 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'
}
}
}
静态typeof
:
class A {
public static Items = {
FOO: 'A'
};
public show() {
alert((<typeof A | typeof B> this.constructor).Items.FOO);
}
}
构造函数接口的静态:
interface AConstructor {
new (): A;
Items: any;
}
class A {
public static Items = {
FOO: 'A'
};
public show() {
alert((this.constructor as AConstructor).Items.FOO);
}
}