Подтвердить что ты не робот

"private" и "public" в угловом компоненте

Если я не добавляю private до foo, loadBar и text, я считаю, что они по умолчанию общедоступны.

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}

Есть ли какой-либо прецедент, когда они public в компоненте?

Для причины инкапсуляции/безопасности всегда должен добавить private для всех, как показано ниже?

export class RandomComponent {
  @Input() private foo: string;
  @Output() private loadBar = new EventEmitter();
  private text: string;
}

Спасибо

4b9b3361

Ответ 1

В ответ на этот вопрос можно многое сказать, это первые мысли, которые пришли мне в голову:

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

Речь идет о инкапсуляции, и когда у вас есть поле или метод на компоненте, который вы хотите, чтобы инкапсулировать в нем, давая понять, что он не должен быть доступен из любого другого, то вы должны абсолютно сделать его private: То, что private есть for: Это сигнализирует о вашем намерении, что к чему бы вы ни относились, не следует прикасаться извне.

То же самое относится и к public: это тоже конструкция только во время компиляции, поэтому тот факт, что члены класса являются public по умолчанию, хотя и имеет значение true, во время выполнения имеет абсолютно нулевое значение. Но когда у вас есть член, который вы явно намереваетесь представить внешнему миру как часть API вашего класса, вы должны сделать его public чтобы сигнализировать об этом намерении: для чего предназначен public.

Это все применимо к Typescript в целом. В частности, в Angular есть определённые допустимые варианты использования открытых членов классов компонентов: например, при реализации шаблона контейнер/компонент (он же smart/dumb), когда "немые" дети вводят "умных" родителей через конструктор, Чрезвычайно важно сообщить о своих намерениях о том, кого и кого не должны касаться члены родителя. В противном случае не удивляйтесь, если поймаете этих глупых детей, которые дурачатся в шкафчике с напитками своих родителей.

Итак, мой ответ на ваш вопрос:

я должен всегда добавлять личное для всех их как ниже?

это решительное нет. Вы не должны всегда добавлять private потому что при этом вы побеждаете цель ключевого слова, потому что оно больше не сигнализирует о каком-либо намерении, если вы помещаете его повсюду: вы также можете нигде не ставить его.

Ответ 2

@drewmoore дает хороший ответ в том, что частный/общественный сводится к намерениям. Но при использовании введенных частных значений необходимо учитывать еще несколько вещей:

  • Оба typescript (noUnusedLocals) и tslint (no-unused-variable) сообщит об ошибках, если вы используете @Import() private foo или constructor(private foo) {}, и используйте только foo в своем шаблоне
  • AOT не работает:

Если мы хотим выпустить typescript как результат процесса компиляции AoT мы должны убедиться, что мы имеем доступ только к публичным полям в шаблонах наших компоненты **