当前位置: 首页 > 知识库问答 >
问题:

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

锺霍英
2023-03-14

我在项目中使用TypeScript时遇到了一个问题。我正在定义这样一个接口:

interface IModuleMenuItem {
    name: string;
}

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

class ModuleMenuItem implements IModuleMenuItem {
    private name: string;
}

我得到以下错误:

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

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

共有3个答案

濮丰
2023-03-14

如果类中有私有字段,则需要引入setter并获取该字段的方法,如下所示:

export class Model {
    private _field: number;

    get field(): number {
        return this._field;
    }

    set field(value: number) {
        this._field= value;
    }
}

然后像往常一样创建接口(我们不能对接口字段使用私有修饰符),如下所示:

export interface IModel {
 field: number;
}

然后像这样实现到我们的类:

export class Model implements IModel {
...
}

TypeScript将理解这个模型是通过接口正确实现的,因为我们已经介绍了set和get方法。

全飞扬
2023-03-14

我想你可以这样做

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         
    }
 }
封飞
2023-03-14

接口定义了“公共”契约,因此在接口上设置受保护的私有的访问修饰符是没有意义的,这更像是一个实现细节。由于这个原因,你不能用一个接口做你想做的事情。

如果您想使属性仅对消费者读取,但可在子类中重写,那么您可以这样做:

interface IModuleMenuItem {
     getName(): string;
}

class ModuleMenuItem implements IModuleMenuItem {
    private name;

    public getName() {
        return name;    
    }

    protected setName(newName : string) {
        name = newName;
    }
}

我认为在TypeScript 2.0(尚未推出)中,如果您在初始化时间只读字段之后,您将能够使用只读访问修饰符-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";
    }
}
 类似资料:
  • 我想定义一个带有对象和不同类型的接口,例如 在定义上,没有问题,但在调用like后 这不起作用,并出现以下错误 错误错误:未捕获(promise中):TypeError:无法设置未定义的属性“名称”TypeError:无法设置未定义的属性“名称” 有一些相似的主题,但它们并不完全相关。(如何在类型脚本接口中定义对象或者如何在类型脚本中定义对象变量的类型?) 我很感激你帮助我找到解决办法。

  • 我刚刚在TypeScript 0.9.5中启动了一个新项目,以下代码抛出了一个错误: 类服务声明了IService,但没有实现它。在类型Service上定义为private的属性“getUserInfo”在类型IService上定义为public 只要我使用TypeScript,我就知道接口不能有访问修饰符!什么给? 打字操场示例

  • 在一个个人项目中,我遇到了一个TypeScript条件类型的问题。我对TypeScript文档中的条件类型有基本的了解。我希望下面的设置工作,但它给出了一个类型错误。 基本上,我试图为从磁盘加载的树节点定义一个接口。这意味着,由于缺少文件等原因,某些节点可能无法正确加载。因此,任何节点实现都可能包含或。 我希望方法的实现可以返回,因为接口是通过类型扩展

  • 问题内容: 我解析了.yaml文件,需要以自定义方式解组其属性之一。我正在使用包裹。 有问题的属性按如下方式存储在我的.yaml文件中: 因此,它基本上是一种类型。 但是我需要在哪里定义为: 我的结构: 我试图像这样实现Unmarshaler接口: 我的问题是在函数内部未定义类型,从而在运行时导致nil指针异常。 我如何在此处正确实现Unmarshaler接口? 问题答案: 由于@Volker并未

  • 我很难协调以下文件中的内容: 当我尝试编译它时,我得到以下错误消息: 这很好,所以这意味着我应该能够通过明确指定财产权的对象类型来绕过这个问题? 除了现在的问题之外,当我使用编译时,我会收到以下错误消息: 似乎不管我做什么,我都会输,因为如果我小心界面上的类型规格并拼出所有内容,那么我就不能将实现专门化为只有1种类型。问题是有文件正是这样做的,如果我想让编译器找到所有的类型,因为我想尽可能显式,我

  • 问题内容: 如何实现与C#代码等效的Python? 这是一个好主意吗??请在您的答案中举例说明。 问题答案: 正如其他人在这里提到的: 在Python中不需要接口。这是因为Python具有适当的多重继承,还具有鸭式输入法,这意味着 必须 在Java中具有接口的地方,而不必在Python中具有接口。 也就是说,接口还有多种用途。其中一些被Python 2.6中引入的Pythons抽象基类覆盖。如果您