在ClassScript

时间:2018-04-13 06:58:29

标签: typescript typescript2.0

http://www.typescriptlang.org/docs/handbook/interfaces.html “Interfaces Extending Classes”部分下的信息表明

  

接口甚至继承了基础的私有成员和受保护成员   类。

但是,当我尝试时,TypeScript会提示错误,指出派生类错误地实现了接口 - 并且缺少基类的私有 protected 成员派生类。

以下是代码:

class View {
  private content: any;
  protected presentation: string;
  public render() {
    console.log("View::render()");
    console.log("content: ", this.content);
    console.log("presentation: ", this.presentation);
  }
  constructor(c: string, p: string) {
    this.content = c;
    this.presentation = p;
  }
}

interface ViewShadow extends View {}

class MobileDisplay implements ViewShadow {
  private content: any;
  protected presentation: string;

  public render() {
    console.log("View::render()");
    console.log("content: ", this.content);
    console.log("presentation: ", this.presentation);
  }
  constructor(c: string, p: string) {
    this.content = c;
    this.presentation = p;
  }
}

2 个答案:

答案 0 :(得分:1)

您需要继续阅读文档。在你引用的那个之后的两个句子,它说:

  

这意味着当您创建一个扩展具有私有或受保护成员的类的接口时,该接口类型只能由该类或其子类实现。

(强调我的)。

所以你需要

class MobileDisplay extends View implements ViewShadow

答案 1 :(得分:1)

如果在接口中继承一个类,接口将继承该类的私有成员,但问题是您无法实现私有字段,编译器将不接受任何内容作为{{的实现除原始字段外的1}} / protected个字段。因此,您的实现必须继承private才能正确实现ViewShadow接口:

View

通常认为非公共字段不应该是要实现的接口的一部分。如果您只想要公共字段/方法,则可以使用映射类型:

class MobileDisplay  extends View implements ViewShadow {
}