reactjs - איך להגדיר תכונה פרטית בעת יישום ממשק ב-Typescript?


אני משתמש ב-TypeScript בפרויקט שלי ונתקלתי בבעיה. אני מגדיר ממשק כך:

interface IModuleMenuItem {
    name: string;
}

אני רוצה ליצור מחלקה שמממשת את הממשק הזה אבל אני רוצה שהשם יהיה מאפיין פרטי כך:

class ModuleMenuItem implements IModuleMenuItem {
    private name: string;
}

אני מקבל את השגיאה הבאה:

מודול Class ModuleMenuItem מממש בצורה שגויה את הממשק IModuleMenuItem. שם התכונה פרטי בסוג ModuleMenuItem אך אינו פרטי בסוג IModuleMenuItem.

איך אני יכול להגדיר מאפיין כפרטי או מוגן בעת יישום ממשק?

תשובה #1

ממשקים מגדירים חוזים "ציבוריים" ולכן אין הגיון שיהיה לממשקים את המודיפייר protected או private, שהם יותר, נניח ככה, פרט של מימוש. מסיבה זו אי אפשר לעשות מה שאתה רוצה עם ממשק.

אם אתה רוצה שהמאפיין יהיה לקריאה בלבד עבור הצרכנים, אך ניתן להחלפה בתת-מחלקה, אז אתה יכול לעשות משהו כזה:

interface IModuleMenuItem {
     getName(): string;
}

class ModuleMenuItem implements IModuleMenuItem {
    private name;

    public getName() {
        return name;    
    }

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

אני חושב שב-TypeScript 2.0 (עדיין לא יצא) תהיה אפשרות להשתמש במודיפייר הגישה 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";
    }
}

תשובה #2

אני חושב שאתה יכול לעשות את זה כך:

interface IModuleMenuItem {
    name: string
}

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

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

    set name(value) {
        // your implementation to set name         
    }
}