模拟TypeScript类的抽象属性

时间:2013-11-13 13:36:14

标签: properties typescript abstract

TypeScript没有这样的“抽象”类。但由于结构类型,接口有点弱。例如,当x instanceof Y是一个接口时,不能断言Y

但是我注意到,在构造函数中未初始化的类字段的行为已经有点像抽象属性:它出现在类的类型上,但它没有运行时存在,除非它实际上是分配的。这允许基类中的字段的定义被子类中的属性定义“覆盖”,因为类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 } } 通过分配继承字段使用

X

如果我尝试通过new 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 } 的情况下,使用继承的定义。

x instanceof X

这是TypeScript中“抽象属性”的合理方法吗?我希望能够断言像X这样的东西(排除了使用{{1}}的接口),这个习惯用法似乎对我有用。

1 个答案:

答案 0 :(得分:1)

您的解决方案停止工作的地方是您发现可以开始分配属性...

var x: X = new X();
x.i = 5;
console.log(x.i);

这看起来不再是抽象的。

为了防止这种情况,你可以开始使用这样的代码......

class Foo {
    get x(): number {
        return undefined;
    }

    set x(val: number) {
        // nothing
    }
}

但如果你为一大堆属性做这件事,你的基类可能会开始膨胀。