private в TS не переводится в символ решётки (#) в JS
Объясните пожалуйста почему в классах TS, при указании private для поля/метода (далее ПМ), после преобразования в файл JS не стоит знак # перед ПМ?
@AlexeyTen дал такой комментарий, что в TS - это просто чисто "декаративный" и что нельзя просто взять и поменять одно на другое. И оставлена ссылка на обсуждение этого вопроса в GitHub
Там лид разработки TS даёт такой ответ. Т.к. не понимал всех слов, потому переводил для себя с помощью гугл перводчика и сервиса Reverso и вот что получилось:
Наш текущий план состоит в том, чтобы оставить текущее приватное поведение как есть
Причины для этого:
- Мы не вносим критические изменения без причины, и ничто внешнее не заставляет людей отказываться от времени компиляции
private- Есть очень хорошие варианты использования приватности только во время компиляции:
privateполя могут быть прочитаны из модульных тестов (Я понимаю, что некоторые люди находят это лично неприятным, но это не универсально.)privateполя имеют гораздо лучшую производительность во время выполнения в сценариях нижнего уровня- Многим людям не нравится синтаксис
#, так зачем навязывать им его- Без
WeakMap(которые есть не у всех сред выполнения) нет хороших эквивалентов понижения уровня для тяжёлого выполнения приватностиНасчет трансформатора, почему бы нет? Их легко заменить с помощью регулярных выражений, если у вас есть мотивация
После долгих обсуждений один из авторов приводит в шутку такой пример, который меня ещё больше смутил:
Права человека:
class Human { #rights; removeRights () { console.log("No"); } } class Government { takeawayRights (human) { human.removeRights(); //No human.rights = undefined; //Not allowed } }Привелегии человека:
class Human { private privileges; removePrivileges () { console.log("No"); } } class Government { takeawayPrivileges (human) { human.removePriveleges(); //No human.privileges = undefined; //OK! } }
И получается, что не смотря на то что ПМ private, я всё равно могу спокойно к нему обращаться напрямую и менять как вздумается
И если честно, прочитал там многое и хоть не до конца, но +- понял как именно работает private, но я так и не понял: Почему он так работает? В чём причина того, чтобы private в TS не работает как # в JS
Если сможете пояснить на пальцах буду очень рад :)
Ответы (1 шт):
И получается, что не смотря на то что ПМ private, я всё равно могу спокойно к нему обращаться напрямую и менять как вздумается
Именно так. TS изначально задуман как надстройка над JS которой не существует в рантайме. Так что доступ к private полям проверяется только в момент компиляции, но если вы как-то сумели «обойти» компилятор, то в скомпилированном JS private поле абсолютно не отличается от public.
В вашем последнем примере компилятор TS будет ругаться на строчку human.privileges = undefined; ошибкой Property 'privileges' is private and only accessible within class 'Human'..