Properties 在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

TypeScript本身没有“抽象”类。但由于结构类型的原因,接口有些薄弱。例如,当
Y
是一个接口时,不能断言
x instanceof Y

但是我注意到,未在构造函数中初始化的类字段的行为已经有点像抽象属性:它出现在类的类型上,但除非实际分配了它,否则它没有运行时存在。这允许基类中的字段定义被子类中的属性定义“覆盖”,正如class
Y
在下面的示例中所做的那样:

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