打字稿隐藏了超级类的道具

时间:2017-12-22 06:19:18

标签: javascript typescript

我有一个扩展另一个类的类。例如:

class Store extends BehaviorSubject {
  constructor(obj) {
     super(obj)
  }
}

我还有更多类扩展Store。 我需要的是一种隐藏BehaviorSubject超类的一些属性的方法,例如next()方法。

class SomeStore extends Store {

}

// I want to hide from this class some methods, properties
// That exists on the BehaviorSubject class. 
const s = new SomeStore();

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:3)

没有。您可以覆盖子类中的方法来执行其他操作(或者不执行任何操作),但这违反了Liskov Substitution原则。

如果您的Store类不是BehaviorSubject,并且不像一个,则扩展不正确。在这种情况下,Store应该包含BehaviorSubject的私有实例,如果需要,通过“代理”它们来公开它的一些方法/属性。

答案 1 :(得分:2)

您可以编写类似下面代码的内容。也没有继承,这很好。通过构造函数传递Store对象是实现DIP (dependency inversion principle)的一种方法。它本身很好,因为它解耦了类,也使StoreWrapper可以测试。

<强>代码

export class StoreWrapper {

  constructor(private _store: Store) { }

  // Expose things that you think are okay to expose...
  getValue = this._store.getValue;
  onCompleted = this._store.onCompleted;
  onError = this._store.onError;
  onNext = this._store.onNext;

  // Anything that is not exposed similar to how it is done above, will be hidden
  // next = this._store.next;

}

<强>用法

const originalStore = ...; // <--- this is your original `Store` object.

const wrappedStore = new StoreWrapper(originalStore);
const value = wrappedStore.getValue();
// ... and so on

重要提示

  • 虽然仍然可以在this._store.next()内调用StoreWrapper,但此代码并未违反LSP。换句话说,它不会破坏应该使用继承的方式。
  • 您现在可以非常轻松地测试这个StoreWrapper课程,以防它增长并获得一些“肉”(逻辑)。