Typescript 我能';不要将从接口实现的类字段设置为私有,也不要将接口字段设置为私有
我在界面上有以下字段:Typescript 我能';不要将从接口实现的类字段设置为私有,也不要将接口字段设置为私有,typescript,class,interface,Typescript,Class,Interface,我在界面上有以下字段: // Stores the to views folder VIEW_PATH: string; // Stores BrowserWindows with respective view browserWindows: [string, BrowserWindow | null][]; 当我在类中实现字段并尝试将其设置为私有时,我会出现以下错误: Class 'WindowHandler' incorrectly implements interface 'IWi
// Stores the to views folder
VIEW_PATH: string;
// Stores BrowserWindows with respective view
browserWindows: [string, BrowserWindow | null][];
当我在类中实现字段并尝试将其设置为私有时,我会出现以下错误:
Class 'WindowHandler' incorrectly implements interface 'IWindowHandler'.
Property 'VIEW_PATH' is private in type 'WindowHandler' but not in type 'IWindowHandler'.ts(2420)
当我尝试将接口字段设置为private时:
'private' modifier cannot appear on a type member.ts(1070)
接口本质上是公共的,因此只能有公共成员,因此它们不接受私有/受保护等定义。另一方面,接口(如类)的实现可以有私有成员/方法来描述其实现细节
您可能误解了接口的概念,接口是您与公共世界之间的一种“契约”,因此在这些契约中没有“隐藏”元素的逻辑使用,或者您试图以错误的方式使用它们。让我知道您的用例是什么,以及为什么您希望一些成员保持隐私以进一步帮助您。作为补充回答: TypeScript接口确实只描述公共契约。在TS术语中,他们描述了。询问者试图将接口成员私有化(他们也不是唯一一个这样做的人,请参见示例)的原因是,两个具有相同
private
成员的不相关类被认为是不兼容的,尽管它们在结构上是相同的
与类似,以下情况会导致类型错误:
class A{private A:string=”“;}
B类{private a:string=”“;}
设a=新a();
a=新的B()//类型具有私有属性“a”的单独声明。
这意味着私人成员确实对类的形状做出了贡献:
C类实现了B{//类型具有私有属性“a”的单独声明。
私人a:string=“”;
}
然而,这些类并不“共享来自同一声明的形状的私有方面”(同上)。只有子类可以与其超类共享形状的私有部分:
D类扩展了B{//OK
构造函数(){
超级();
}
}
因此,只有类具有private
成员。这也不太可能改变为允许接口实现受保护的
成员(本质上非常相似)的建议
另见:
私人
成员为什么要将它们设置为私有?这样它们就无法访问…如果无法访问,则将它们从接口中删除。您试图执行的操作毫无意义。您的界面显示
实现我的每个类都有这个字段,您可以访问它
,然后类显示哦,顺便说一句,您不能访问这个字段
。您必须选择实际需要的字段,通过在接口中声明来公开提供字段,或者通过不在接口中声明来隐藏字段。在TS中,不仅类实现了接口,还实现了POJO。总而言之:TS不提供这种能力;对于TS来说,这毫无意义。首先,感谢您的深刻而全面的回答。我现在脑子里有了你说的话,这是有道理的。我很惊讶,因为在Java上你可以将实现的成员设置为私有或公共,所以我想知道我是否仍然可以在TypeScript中这样做。哦,现在我明白你为什么这么想了,因为Java 9中的接口比普通接口复杂得多。它们内部也可以有方法的实现。这使得它们非常复杂,这就是为什么Java9必须向它们引入私有方法的概念。因为混合实现和接口概念。Typescript中的接口不是这种情况,这些接口只是类应该如何实现东西的常用处方。