"частный" и "общественный" в угловом компоненте 2
если я не добавить частная до 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;
}
спасибо
2 ответа:
есть что сказать в ответ на этот вопрос, это первые мысли, которые пришли мне в голову:
прежде всего, имейте в виду, что
private
- Это только конструкция времени компиляции - она не может быть применена во время выполнения (см. здесь и здесь для соответствующих обсуждений). Таким образом, пожалуйста, избавьте себя от каких-либо понятийprivate
быть полезным в любом случае в целях безопасности. Это просто не об этом.это и об инкапсуляции, и когда у вас есть поле или метод на вашем компоненте, который вы хотите инкапсулировать в нем, давая понять, что он не должен быть доступен из другого места, то вы должны абсолютно сделать это
private
: вот такprivate
для: это сигнализирует о ваших намерениях что бы вы ни надели его, не должно касаться вне класса.то же самое
public
: это тоже конструкция только для компиляции, поэтому тот факт, что члены класса являютсяpublic
по умолчанию, в то время как true, имеет ровно нулевое значение во время выполнения. Но когда у вас есть член, который вы явно намереваетесь предоставить внешнему миру как часть API вашего класса, вы должны абсолютно сделать этоpublic
чтобы сигнализировать об этом намерении: вот чтоpublic
для.это все применимо к TypeScript в целом. В частности, в Angular существуют определенно допустимые варианты использования для наличия открытых членов в классах компонентов: например, когда реализация контейнеров/составляющая (он же умный/тупой) шаблон, с "тупыми" детьми, вводящими "умных" родителей через инъекцию конструктора, чрезвычайно важно сообщить свое намерение о том, какие члены на родителе должны и не должны касаться детей: в противном случае, не удивляйтесь, когда вы поймаете этих тупых детей, дурачащихся в шкафу с алкоголем своих родителей.
Итак, мой ответ на ваш вопрос:
должен ли я всегда добавлять private для всех из них, как показано ниже?
это подчеркнуто нет. Вы не должны всегда добавить
private
потому что при этом вы побеждаете цель ключевого слова, потому что он больше не сигнализирует о каком-либо намерении, если вы поместите его везде: вы можете также не помещать его нигде.
@drewmoore предоставляет хороший ответ в том, что частным и государственным сводится к намерению. Но есть еще несколько вещей, которые следует учитывать при использовании введенных частных значений:
- оба typescript (noUnusedLocals) и tslint (нет-неиспользованный-переменная) будет сообщать об ошибках, если вы используете
@Import() private foo
илиconstructor(private foo) {}
иfoo
в шаблоне- АОТ не будет работать:
Если мы хотим излучать TypeScript как результат процесса компиляции AoT мы должны убедиться, что мы получаем доступ только к открытым полям в шаблонах наших компоненты**