Я смотрю на реализацию частных членов в TypeScript, и это меня немного сбивает с толку. Intellisense не позволяет получить доступ к закрытому члену, но в чистом JavaScript все это есть. Это заставляет меня думать, что TS неправильно реализует закрытые члены. Есть предположения?
class Test{
private member: any = "private member";
}
alert(new Test().member);
javascript
typescript
Шон Фельдман
источник
источник
Ответы:
Как и при проверке типов, конфиденциальность членов обеспечивается только внутри компилятора.
Частное свойство реализовано как обычное свойство, и коду вне класса не разрешен доступ к нему.
Чтобы сделать что-то действительно частным внутри класса, это не может быть членом класса, это будет локальная переменная, созданная внутри области действия функции внутри кода, который создает объект. Это означало бы, что вы не можете получить к нему доступ как к члену класса, то есть используя
this
ключевое слово.источник
this
ключевого слова.JavaScript поддерживает частные переменные.
В TypeScript это можно выразить так:
РЕДАКТИРОВАТЬ
Этот подход следует использовать ВЗАИМОДЕЙСТВИТЕЛЬНО там, где это абсолютно необходимо. Например, если вам нужно временно кэшировать пароль.
Использование этого шаблона связано с затратами на производительность (не имеет отношения к Javascript или Typescript), и его следует использовать только в случае крайней необходимости.
источник
var _this
для использования в функциях с ограниченным объемом? Почему у вас есть сомнения, делая это в области класса?Как только поддержка WeakMap станет более доступной, появится интересная техника, подробно описанная в примере №3 здесь .
Он позволяет использовать частные данные и позволяет избежать затрат на производительность, как в примере Джейсона Эванса, позволяя доступ к данным из методов прототипа, а не только из методов экземпляра.
На связанной странице MDN WeakMap указана поддержка браузерами Chrome 36, Firefox 6.0, IE 11, Opera 23 и Safari 7.1.
источник
protected
параметров? : DТак как TypeScript 3.8 будет выпущен, вы сможете объявить закрытое поле, к которому нельзя получить доступ или даже обнаружить за пределами содержащего класса .
Частные поля начинаются с
#
символаОбратите внимание, что эти частные поля будут отличаться от полей, отмеченных
private
ключевым словомRef. https://devblogs.microsoft.com/typescript/announcing-typescript-3-8-beta/
источник
Спасибо Шону Фельдману за ссылку на официальное обсуждение этого вопроса - см. Его ответ по ссылке.
Я прочитал обсуждение, на которое он ссылался, и вот краткое изложение ключевых моментов:
this
без какого-либо обходного пути@private
минификаторов, которые распознают, что аннотация может эффективно минимизировать имена методов.Общие контраргументы против добавления поддержки видимости в выдаваемый код:
источник
В TypeScript частные функции доступны только внутри класса. подобно
И он покажет ошибку, когда вы попытаетесь получить доступ к частному члену. Вот пример:
источник
Я понимаю, что это более раннее обсуждение, но все же может быть полезно поделиться своим решением проблемы предположительно частных переменных и методов в TypeScript, «просачивающихся» в открытый интерфейс скомпилированного класса JavaScript.
Для меня эта проблема чисто косметическая, т.е. все дело в визуальном беспорядке при просмотре переменной экземпляра в DevTools. Мое исправление - сгруппировать частные объявления вместе внутри другого класса, который затем создается в основном классе и назначается
private
(но все еще общедоступной в JS) переменной с именем типа__
(двойное подчеркивание).Пример:
Когда
myClass
экземпляр просматривается в DevTools, вместо того, чтобы видеть, как все его «частные» члены перемешаны с действительно общедоступными (что может стать очень визуально беспорядочным в правильно отрефакторинговом реальном коде), вы видите их аккуратно сгруппированными внутри свернутого__
свойства:источник
Вот многоразовый подход для добавления правильных частных свойств:
Допустим, у вас есть класс,
Client
которому нужны два частных свойства:prop1: string
prop2: number
Вот как вы это реализуете:
А если все, что вам нужно, - это отдельная частная собственность, тогда это станет еще проще, потому что
ClientPrivate
в этом случае вам не нужно будет определять ее .Стоит отметить, что по большей части class
Private
просто предлагает хорошо читаемую подпись, тогда как прямое использование этогоWeakMap
не делает.источник