如何在Typescript中实现接口时定义私有属性?

Pac*_*chu 37 typescript reactjs

我在我的项目中使用TypeScript,但我遇到了一个问题.我正在定义这样的界面:

interface IModuleMenuItem {
    name: string;
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个从这个接口实现的类,但我希望该名称是这样的私有属性:

class ModuleMenuItem implements IModuleMenuItem {
    private name: string;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

类ModuleMenuItem错误地实现了接口IModuleMenuItem.属性名称在ModuleMenuItem类型中是私有的,但在类型IModuleMenuItem中不是.

在实现接口时,如何将属性定义为私有或受保护?

Iva*_*tev 41

接口定义了"公共"合同,因此在接口上拥有protectedprivate访问修饰符是没有意义的,接口更多的是让我们称之为实现细节.因此,您无法通过界面执行所需操作.

如果您想要将属性设置为只读给消费者,但是在子类中可以覆盖,那么您可以执行以下操作:

interface IModuleMenuItem {
     getName(): string;
}

class ModuleMenuItem implements IModuleMenuItem {
    private name;

    public getName() {
        return name;    
    }

    protected setName(newName : string) {
        name = newName;
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为在TypeScript 2.0(尚未推出)中,readonly如果您在初始化时间readonly字段之后,您将能够使用访问修饰符 - https://basarat.gitbooks.io/typescript/content/docs/types/readonly.html

interface IModuleMenuItem {
     readonly name : string;
}

class ModuleMenuItem implements IModuleMenuItem {
    public readonly name : string;

    constructor() {
        name = "name";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Pachu对我来说这就是接口的全部要点.它是定义一个**公共**合同,一个实现"符合"并且外部组件可以消耗而不关心它是如何实现的.你所追求的是更强制的实现行为,这是通过大多数语言中的抽象基类实现的. (6认同)
  • 那怎么办?我的意思是它只是愚蠢的,它破坏了整个界面的意义。 (3认同)
  • @theMayer 这不是必需的。您可以使用抽象类来实现接口并创建另一个类来扩展该类。这种实现方法称为“复合”。尽管您必须使用 protected 而不是 private,因为 private 无法重新实现。 (2认同)

Abd*_*sam 6

我想你可能会这样

interface IModuleMenuItem{
    name: string
}

class ModuleMenuItem implements IModuleMenuItem {
    private _name: string;
    constructor() {
    _name = "name";
    }

    get name(){
    // your implementation to expose name
    }

    set name(value){
    // your implementation to set name         
    }
 }
Run Code Online (Sandbox Code Playgroud)