Подтвердить что ты не робот

Частные "функции" в TypeScript

Возможно ли создать частную "функцию" (метод) в классе TypeScript? Предположим, что мы имеем следующий файл Person.ts TypeScript:

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

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

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

Что при компиляции преобразуется в следующее:

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

Наблюдения

Я ожидал, что функция whisper будет объявлена ​​в закрытии, но не на прототипе? По сути, это делает функцию whisper открытой при компиляции?

4b9b3361

Ответ 1

Публичные/частные ключевые слова TypeScript применяются только к способу, которым TypeScript проверяет ваш код - они не оказывают никакого влияния на выход JavaScript.

Согласно спецификации языка (стр. 9-10):

Частная видимость - это конструкция времени разработки; он применяется во время проверки статического типа, но не подразумевает принудительное выполнение во время выполнения.... TypeScript обеспечивает инкапсуляцию реализации в классы во время разработки (путем ограничения использования частных членов), но не может обеспечить инкапсуляцию во время выполнения, потому что все свойства объекта доступны во время выполнения. Будущие версии JavaScript могут предоставлять частные имена, которые позволят принудительному исполнению частными членами

Это уже было задано и ответили здесь: fooobar.com/questions/76375/...

Обновление: этот старый ответ по-прежнему получает объем трафика, поэтому стоит отметить, что в дополнение к указанной выше ссылке на язык, общие, частные и (сейчас) защищенные члены подробно описаны в главе справочника по TypeScript по классам.

2018 Обновление реализации ES Private Fields теперь представляет собой элемент Future на RoadMap TypeScript, хотя обсуждение предполагает, что это будет параллельный жесткий частный вариант, а не замена текущей мягкой частной реализации.

Ответ 2

В Javascript (в отличие от TypeScript) у вас не может быть частной функции "member".

Если вы определяете закрытую функцию в закрытии, вы не сможете вызвать ее как метод экземпляра в экземпляре вашего класса.

Если это то, что вы хотите, просто переместите определение функции TypeScript вне тела класса.