83 votes

Les "fonctions" privées en TypeScript

Est-il possible de créer une "fonction" (méthode) privée dans une classe TypeScript ? Supposons que nous ayons la classe suivante Person.ts Fichier TypeScript :

class Person {
    constructor(public firstName: string, public lastName: string) {
    }

    public shout(phrase: string) {
        alert(phrase);
    }

    private whisper(phrase: string) {
        console.log(phrase);
    }
}

Ce qui, une fois compilé, se transforme en ce qui suit :

var Person = (function () {
    function Person(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    Person.prototype.shout = function (phrase) {
        alert(phrase);
    };
    Person.prototype.whisper = function (phrase) {
        console.log(phrase);
    };
    return Person;
})();

Observations

Je m'attendais à ce que le whisper doit-elle être déclarée dans la fermeture, mais pas dans le prototype ? Essentiellement, cela fait de la whisper publique lors de la compilation ?

96voto

JcFx Points 6266

Mise à jour . Méthodes privées utilisant # sont désormais mises en œuvre. Voir ici : https://github.com/microsoft/TypeScript/pull/42458

--

Les mots-clés publics/privés TypeScript ne s'appliquent qu'à la manière dont TypeScript vérifie votre code - ils n'ont aucun effet sur la sortie JavaScript.

Selon le la spécification linguistique (pp. 9-10) :

La visibilité privée est une construction qui intervient au moment de la conception ; elle est appliquée lors de la vérification statique des types. mais n'implique aucune application au moment de l'exécution. ... TypeScript impose l'encapsulation de l'implémentation dans les classes au moment de la conception. conception (en limitant l'utilisation des membres privés), mais ne peut pas l'encapsulation au moment de l'exécution car toutes les propriétés des objets sont accessibles au moment de l'exécution. Les futures versions de JavaScript pourront fournir des propriétés des noms privés qui permettraient d'imposer l'utilisation de membres privés au moment de l'exécution. privés

Cette question a déjà été posée et a reçu une réponse ici : https://stackoverflow.com/a/12713869/1014822

Mise à jour : Cette vieille réponse reçoit encore beaucoup de trafic, il est donc utile de noter qu'en plus du lien vers la spécification du langage ci-dessus, les membres publics, privés et (maintenant) protégés sont couverts en détail dans le document TypeScript manuel chapitre sur les classes.

Mise à jour 2018 L'implémentation des champs privés ES est désormais un élément à venir sur le site TypeScript Feuille de route bien que discussion suggère qu'il s'agira d'une option privée dure parallèle, qui ne remplacera pas la mise en œuvre actuelle de l'option privée douce.

Mise à jour 2020 Exécution privée champs en utilisant le # ont été mis en œuvre dans la version TS 3.8. Il y a une bonne discussion sur la façon dont ils fonctionnent et comment ils diffèrent des champs à la compilation avec la section private mot-clé sur StackOverflow aquí .

Privé méthodes ont atteint le stade 3 du groupe de travail TC39. Cette fonctionnalité fait actuellement l'objet de discussions actives pour TypeScript, par exemple aquí .

11voto

SLaks Points 391154

En Javascript (contrairement à TypeScript), il n'est pas possible d'avoir une fonction "membre" privée.

Si vous définissez une fonction privée dans la fermeture, vous ne pourrez pas l'appeler en tant que méthode d'instance sur une instance de votre classe.

Si c'est ce que vous voulez, il suffit de déplacer la définition de la fonction TypeScript en dehors du corps de la classe.

1voto

air5 Points 61

Vous pouvez utiliser des variables et des fonctions de classe privées dans TypeScript/Webpack et même dans les dernières versions de Google Chrome de manière native. Il suffit d'ajouter un # avant le nom. Voir aussi aquí .

MyClass {

  #privateMember: Number = 4 

  #privateMethod() {
      this.#privateMember = 3
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X