Properties 在TypeScript类上模拟抽象属性
TypeScript本身没有“抽象”类。但由于结构类型的原因,接口有些薄弱。例如,当Properties 在TypeScript类上模拟抽象属性,properties,typescript,abstract,Properties,Typescript,Abstract,TypeScript本身没有“抽象”类。但由于结构类型的原因,接口有些薄弱。例如,当Y是一个接口时,不能断言x instanceof Y 但是我注意到,未在构造函数中初始化的类字段的行为已经有点像抽象属性:它出现在类的类型上,但除非实际分配了它,否则它没有运行时存在。这允许基类中的字段定义被子类中的属性定义“覆盖”,正如classY在下面的示例中所做的那样: class X { // behaves somewhat like an abstract property i: numb
Y
是一个接口时,不能断言x instanceof Y
但是我注意到,未在构造函数中初始化的类字段的行为已经有点像抽象属性:它出现在类的类型上,但除非实际分配了它,否则它没有运行时存在。这允许基类中的字段定义被子类中的属性定义“覆盖”,正如classY
在下面的示例中所做的那样:
class X {
// behaves somewhat like an abstract property
i: number
}
class Y extends X {
_i: number
constructor () {
super()
this._i = 7
}
// Provide an "implementation" of i
get i (): number {
return this._i
}
set i (i: number) {
this._i = i
}
}
另一方面,下面的Z
通过分配给继承的字段来使用该字段:
// This sub-class uses the inherited field.
class Z extends X {
constructor () {
super()
this.i = 6
}
}
如果我试图通过new X
使用X
上的字段,则该字段未定义。在Y
的情况下,将拾取覆盖属性。在Z
的情况下,使用继承的定义
function testProp (): void {
var x: X
x = new X
console.log(x.i) // undefined
x = new Y
console.log(x.i) // 7
x = new Z
console.log(x.i) // 6
}
这是处理TypeScript中“抽象属性”的合理方法吗?我希望能够断言像
x instanceof x
(这就排除了使用x
接口)这样的东西,到目前为止,这个习惯用法似乎对我有效。解决方案停止工作的地方是当您注意到可以开始分配给属性时
var x: X = new X();
x.i = 5;
console.log(x.i);
这看起来不再是一种行为了
为了防止这种情况,您可以开始使用这样的代码
class Foo {
get x(): number {
return undefined;
}
set x(val: number) {
// nothing
}
}
但是,如果对一大堆属性执行此操作,则基类可能会开始膨胀。或者
集
可能会抛出一个AbstractMethodError
。是的-但本质上,您需要在某个地方抛出错误-抽象方法也是如此。Typescript