TypeScript частные участники

Я рассматриваю реализацию частных членов в TypeScript, и я нахожу это немного запутанным. Intellisense не позволяет получить доступ к частному члену, но в чистом JavaScript все это есть. Это заставляет меня думать, что TS не реализует частных членов правильно. Любые мысли?

class Test{
  private member: any = "private member";
}
alert(new Test().member);

Ответ 1

Так же, как и при проверке типов, конфиденциальность членов выполняется только в компиляторе.

Частное свойство реализуется как регулярное свойство, а код вне класса не имеет доступа к нему.

Чтобы сделать что-то действительно частным внутри класса, он не может быть членом класса, это будет локальная переменная, созданная внутри области видимости функции внутри кода, который создает объект. Это означает, что вы не можете получить к нему доступ, как член класса, т.е. С помощью ключевого слова this.

Ответ 2

JavaScript поддерживает частные переменные.

function MyClass() {
    var myPrivateVar = 3;

    this.doSomething = function() {
        return myPrivateVar++;        
    }
}

В TypeScript это будет выглядеть так:

class MyClass {

    doSomething: () => number;

    constructor() {
        var myPrivateVar = 3;

        this.doSomething = function () {
            return myPrivateVar++;
        }
    }
}

ИЗМЕНИТЬ

Этот подход следует использовать только SPARINGLY, где это абсолютно необходимо. Например, если вам нужно временно кэшировать пароль.

При использовании этого шаблона (не имеет значения Javascript или Typescript) существуют затраты на производительность, и их следует использовать только там, где это абсолютно необходимо.

Ответ 3

Как только поддержка WeakMap более доступна, есть интересная техника, подробно описанная в примере # 3 здесь.

Он позволяет личные данные И избегает затрат на производительность примера Джейсона Эванса, позволяя доступным данным из методов прототипа вместо методов экземпляра.

Связанная страница MDN WeakMap отображает поддержку браузера в браузерах Chrome 36, Firefox 6.0, IE 11, Opera 23 и Safari 7.1.

let _counter = new WeakMap();
let _action = new WeakMap();
class Countdown {
  constructor(counter, action) {
    _counter.set(this, counter);
    _action.set(this, action);
  }
  decrement() {
    let counter = _counter.get(this);
    if (counter < 1) return;
    counter--;
    _counter.set(this, counter);
    if (counter === 0) {
      _action.get(this)();
    }
  }
}

Ответ 4

Спасибо Шон Фельдман за ссылку на официальную дискуссию по этому вопросу - см. его ответ за ссылку.

Я прочитал дискуссию, с которой он связался, и здесь краткое изложение ключевых моментов:

  • Предложение: частные свойства в конструкторе
    • проблемы: невозможно получить доступ к функциям прототипа
  • Предложение: частные методы в конструкторе
    • проблемы: то же, что и со свойствами, плюс вы теряете преимущество в производительности при создании функции один раз в классе в прототипе; вместо этого вы создаете копию функции для каждого экземпляра
  • Предложение: добавьте шаблон для абстрактного доступа к ресурсам и обеспечьте видимость
    • проблемы: основные накладные расходы; TypeScript предназначен для больших приложений
  • Предложение: TypeScript уже завершает определение конструктора и прототипа метода в закрытии; ставить частные методы и свойства там
    • проблемы с помещением частных свойств в это закрытие: они становятся статическими переменными; для каждого экземпляра не существует
    • проблемы с помещением частных методов в это закрытие: они не имеют доступа к this без какого-либо обходного пути
  • Предложение: автоматически кастовать имена приватных переменных
    • counter arguments: это соглашение об именах, а не языковая конструкция. Соберите себя сами.
  • Предложение: аннотировать частные методы с помощью @private, поэтому minifiers, которые признают, что аннотация может эффективно минимизировать имена методов
    • Нет значимых аргументов счетчика для этого

Общие контр-аргументы для добавления поддержки видимости в испускаемом коде:

  • проблема заключается в том, что сам JavaScript не имеет модификаторов видимости - это не проблема TypeScript
  • в сообществе JavaScript уже установлен шаблон: префикс частных свойств и методов с подчеркиванием, в котором говорится, что "действуйте на свой страх и риск"
  • Когда TypeScript дизайнеры заявили, что действительно частные свойства и методы не являются "возможными", они подразумевают "невозможно по нашим конструктивным ограничениям", а именно:
    • Испускаемый JS является идиоматическим
    • Бойлер минимальный
    • Никаких дополнительных накладных расходов по сравнению с обычным JS OOP

Ответ 5

В TypeScript Частные функции доступны только внутри класса. Как

введите описание изображения здесь

При попытке доступа к частному члену будет отображаться ошибка. Вот пример:

введите описание изображения здесь

Примечание: с javascript будет хорошо, и обе функции доступны снаружи.

Ответ 6

Многие утверждают, что это невозможно из-за ограничений в JavaScript. Я бы сказал, что это ограничения в творчестве разработчиков JavaScript.

Я сейчас разрабатываю библиотеку, которая позволяет использовать частные и защищенные наследуемые классы классов, а также интерфейсы и т.д., называемые ClassJS. Посмотрите здесь, на GitHub.