typescript - Jag kan inte göra ett klassfält som implementeras från ett gränssnitt privat, eller göra ett gränssnitts fält privat
Jag har dessa fält på gränssnittet:
// Stores the to views folder
VIEW_PATH: string;
// Stores BrowserWindows with respective view
browserWindows: [string, BrowserWindow | null][];
När jag implementerar fälten i min klass och försöker sätta dem som privata får jag detta fel:
Class 'WindowHandler' incorrectly implements interface 'IWindowHandler'.
Property 'VIEW_PATH' is private in type 'WindowHandler' but not in type 'IWindowHandler'.ts(2420)
När jag försöker sätta gränssnitts-fälten till privata:
'private' modifier cannot appear on a type member.ts(1070)
Svar #1
Gränssnitt är i sin natur offentliga, och därför kan de endast ha offentliga medlemmar, så de accepterar inte privata/skyddade etc. definitioner. Å andra sidan kan implementeringen av ett gränssnitt, såsom en klass, ha privata medlemmar/metoder för dess implementeringsdetaljer.
Du har troligen antingen missuppfattat konceptet med gränssnitt, som är en slags 'kontrakt' mellan dig och den offentliga världen, och därför finns det ingen logisk användning av 'dolda' element i dessa kontrakt, eller så försöker du använda dem på ett felaktigt sätt. Låt mig veta vad ditt användningsfall är och varför du vill att vissa medlemmar ska vara privata för att kunna hjälpa dig vidare.
Svar #2
Som ett kompletterande svar:
Det är sant att TypeScript-gränssnitt endast beskriver ett offentligt kontrakt. I TS-termer beskriver de formen på värden. Den som ställt frågan försök (de är inte heller de enda som försökt detta - se till exempel detta GitHub-ärende) att göra gränssnittsmedlemmar privata kommer från det faktum att två orelaterade klasser med samma private-medlem anses vara inkompatibla trots att de är identiska strukturellt.
Liknande handboks-exemplet leder följande till ett typfel:
class A { private a : string = ""; }
class B { private a : string = ""; }
let a = new A();
a = new B(); //Types have separate declarations of a private property 'a'.
Så gör detta också, vilket betyder att privata medlemmar faktiskt bidrar till formen av en klass:
class C implements B { //Types have separate declarations of a private property 'a'.
private a : string = "";
}
Dessa klasser delar dock inte "den privata sidan av sin form från samma deklaration" (ibid.). Endast en underklass kan dela den privata sidan av formen med sin överklass:
class D extends B { //OK
constructor() {
super();
}
}
Så, endast klasser har private medlemmar. Detta är också osannolikt att ändras eftersom ett förslag om att tillåta gränssnitt att implementera protected medlemmar (som är väldigt lika i naturen) avslogs som osäkert.
Se även:
- relaterade frågor och svar om privata medlemmar och gränssnitt.
- Diskussion om varför
private-medlemmar påverkar kompatibilitet.
