it-swarm.com.de

Private "Funktionen" in TypeScript

Ist es möglich, eine private "Funktion" (Methode) innerhalb einer TypeScript-Klasse zu erstellen? Nehmen wir an, wir haben das folgende Person.ts TypeScript-Datei:

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

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

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

Was beim Kompilieren in folgendes umgewandelt wird:

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;
})();

Beobachtungen

Ich habe erwartet, dass die whisper -Funktion innerhalb des Closures deklariert wird, aber nicht auf dem Prototyp? Im Wesentlichen macht dies die Funktion whisper beim Kompilieren öffentlich?

68
Richard

Öffentliche/private TypeScript-Schlüsselwörter gelten nur für die Art und Weise, wie TypeScript Ihren Code überprüft. Sie haben keine Auswirkungen auf die JavaScript-Ausgabe.

Gemäß der Sprachspezifikation (S. 9-10):

Private Visibility ist ein Konstrukt zur Entwurfszeit. Es wird während der statischen Typprüfung erzwungen, impliziert jedoch keine Laufzeiterzwingung. ... TypeScript erzwingt die Einkapselung der Implementierung in Klassen zur Entwurfszeit (durch Einschränkung der Verwendung privater Member), kann die Einkapselung jedoch nicht zur Laufzeit erzwingen, da zur Laufzeit auf alle Objekteigenschaften zugegriffen werden kann. Zukünftige Versionen von JavaScript können private Namen bereitstellen, die die Laufzeiterzwingung für private Mitglieder ermöglichen

Dies wurde bereits hier gefragt und beantwortet: https://stackoverflow.com/a/12713869/1014822

Update: Diese alte Antwort erhält immer noch eine Menge Verkehr, so erwähnenswert, dass zusätzlich zu dem oben angegebenen Sprachspezifikationslink public, private und ( now) geschützte Mitglieder werden ausführlich im TypeScript Handbuch Kapitel über Klassen behandelt.

2018 Update Die Implementierung von privaten ES-Feldern ist jetzt ein zukünftiges Element im TypeScript RoadMap obwohl Diskussion schlägt vor, dass dies eine parallele Hard-Private-Option und kein Ersatz für die derzeitige Soft-Private-Implementierung ist.

77
Jude Fisher

In Javascript (im Gegensatz zu TypeScript) können Sie keine private "Member" -Funktion haben.

Wenn Sie eine private Funktion im Closure definieren, können Sie diese nicht als Instanzmethode für eine Instanz Ihrer Klasse aufrufen.

Wenn Sie dies wünschen, verschieben Sie einfach die TypeScript-Funktionsdefinition außerhalb des Klassenkörpers.

7
SLaks