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 шт):

Автор решения: Alexey Ten

И получается, что не смотря на то что ПМ private, я всё равно могу спокойно к нему обращаться напрямую и менять как вздумается

Именно так. TS изначально задуман как надстройка над JS которой не существует в рантайме. Так что доступ к private полям проверяется только в момент компиляции, но если вы как-то сумели «обойти» компилятор, то в скомпилированном JS private поле абсолютно не отличается от public.

В вашем последнем примере компилятор TS будет ругаться на строчку human.privileges = undefined; ошибкой Property 'privileges' is private and only accessible within class 'Human'..

→ Ссылка