Как работает инкапсуляция в TypeScript - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь понять, как работает инкапсуляция в Typescript, и придумаю пример, который вводит меня в заблуждение, почему я могу получить доступ и даже изменить непосредственно закрытые члены определенного класса.

class Encapsulate {
    str:string = "hello"
    private str2:string = "world"
}

var obj = new Encapsulate();
console.log(obj.str);     //accessible
obj.str2 = "something else";
console.log(obj.str2);   //compilation Error as str2 is private

ВЫХОД: привет что-то еще

Я получаю предупреждение о времени компиляции, например, Ошибка компиляции, так как str2 является частной, но все же я могу ее изменить илидоступ к нему.Я скучаю по концепции инкапсуляции в целом, что это такое и как это работает на Typescript.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Javascript не имеет понятия закрытых и открытых членов для класса (, хотя это может измениться в будущем ).В настоящее время пометка свойства или функции в классе как private проверяется только во время компиляции (вот почему вы получаете синтаксическую ошибку).

Ваш код все равно будет работать, потому что даже если Typescript сгенерировал синтаксическую ошибкуон также, скорее всего, по-прежнему выводит действительный код Javascript.

0 голосов
/ 12 декабря 2018

Проблема в том, что typeScript просто компилирует в javaScript, но у него нет времени выполнения.

TypeScript выдаёт вам эти предупреждения при типе компиляции .Он говорит вам:

Эй, Encapsulate str2 является частным, и вы все еще пытаетесь получить к нему доступ.Вы не должны этого делать.

Однако, как только ts скомпилирует и сгенерирует код js, все аннотации машинописного текста будут потеряны в коде.JavaScript ничего не знает о private, enum или interfaces.Как только ваш код будет скомпилирован и затем запущен в браузере или в любой другой среде выполнения js, у вас будет Encapsulate объект javaScript с двумя полями, str1 и str2.Они не могут быть private или public, потому что js не знает об этом.Encapsulate будет простым голым объектом javaScript.

Так что, в основном, typeScript помогает вам обнаруживать ошибки во время компиляции.Но как только код скомпилируется, он «забудет» все о аннотациях typeScript.

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

0 голосов
/ 12 декабря 2018

Ожидается, что TypeScript - это просто статический язык проверки типов.После компиляции в js выполняемая вами операция действительна, следовательно, нет ошибки времени выполнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...