Что такое файлы «только для чтения» и для чего они используются?
Ответ: Файлы «только для чтения» («read-only») могут быть открыты, но не могут быть отредактированы. Они обычно используются в качестве шаблонов для создания новых файлов. Так как файлы «только для чтения» не могут быть изменены, они часто выступают в качестве модели или основы для создания нескольких похожих файлов. И Windows и Mac OS X поддерживают файлы «только для чтения».
ОС Windows
Чтобы сделать файл «только для чтения» («read-only») в Windows, сперва нужно щелкнуть правой кнопкой мыши по файлу, а затем выбрать пункт «Свойства» («Properties»). Затем в нижней части окна Свойства в разделе «Атрибуты» («Attributes») следует просто установить флажок «Только для чтения» (как показано ниже) и нажать кнопку Применить («Apply»).

Как только свойство файла установлено как «только для чтения», его нельзя перезаписать. Хотя, открыв файл, можно сохранить его с другим именем файла. Открытие файла только для чтения похоже на использование функции «Открыть как копию» («Open as a copy»), которую предлагают некоторые программы. Однако, в отличие от открытия файла с признаком «только для чтения», функция «Открыть как копию» создает копию файла при его открытии, а не при его сохранении.
Примечание: Если попытаться отредактировать и сохранить файл с атрибутом «только для чтения», то появится ошибка при сохранении «Не удается создать файл (путь к файлу). Проверьте правильность пути и имени файла.»
Mac OS X
Пользователи ОС Mac также могут создавать документы «только для чтения». Чтобы сделать файл «только для чтения» в Mac OS X, нужно щелкнуть правой кнопкой мыши (или Control-клик) по файлу и затем выбрать пункт меню «Получение информации» («Get Info»). В верхней части Информационного окна имеется флажок «Блокнот» («Stationery Pad») (см. ниже). Установка этого флажка, преобразует файл в шаблон «только для чтения». Всякий раз, когда открывается файл с установленным флажком «Блокнот», создается копия файла.
Опции «Блокнот» в Mac OS X служат полезным средством создания нескольких похожих документов на основе одного стандартного документа. Тем не менее, «блокноты» могут быть перезаписаны, если файл с таким же именем сохраняется на документ-«блокнот». Таким образом, рекомендуется для хранения документов-«блокнотов» использовать отдельный каталог, в котором не хранить редактируемые документы.
В Mac OS X для предотвращения от случайного удаления важных документы или заменены их новыми документами, пользователи могут выбрать флажок «Заблокированные» («Locked») в Информационном окно файла (см. выше).
HTML-атрибуты Disabled и Readonly
Атрибуты disable и readonly — это сокращённые атрибуты, поэтому их можно использовать без значений.
Передача заблокированных <input> и <textarea> на сервер
Для передачи на сервер заблокированных (нередактируемых) значений элементов, созданных с помощью <input> и <textarea> , необходимо использовать атрибут readonly ; однако он не меняет цвет фона элемента по умолчанию на серого оттенка, в отличие от disabled , что может поставить Человека в тупик — почему Он не может редактировать содержимое. В этом случае лучше сделать имитацию заблокированности с помощью CSS, то есть просто определить элементу светло-серый фон.
Этот эффект наблюдается во всех популярных браузерах, кроме Safari, который меняет цвет фона элемента на серого оттенка при применении к нему атрибута readonly .
Пример использования атрибута Disabled
Пример использования атрибута Readonly
Readonly как Disabled
Как видно из примеров выше, применение разных атрибутов определяет различное стилевое оформление соответствующих элементов. Чтобы сделать его одинаковым, можно использовать следующий код CSS:
Для Opera Presto второе правило не работает, поэтому в данном браузере, при получении фокуса текстовой областью ( <textarea> ) с атрибутом readonly , вокруг элемента будет отображаться пунктирная рамка.
Typescript. Свойства доступные только для чтения
В версии Typescript 2.0 был добавлен модификатор readonly . Свойствам помеченным модификатором readonly значение может быть присвоено только в момент инициализации, или в конструкторе того же класса. Любые другие присваивания значении запрещены.
Давайте посмотрим на пример. Здесь представлен простой тип Point , описываемый двумя свойствами, доступными только для чтения:
Теперь мы можем создать объект представляющий собой начало координат, и инициализировать x и y со значением 0 :
Однако, так как свойства x и y помечены readonly , мы не можем изменить их значения впоследствии:
Более реалистичный пример
Приведённый выше пример может показаться надуманным, давайте рассмотрим следующую функцию:
Функция moveX не должна изменять свойство x переданного объекта point . Компилятор TypeScript обязательно начнёт ругаться, если вы попробуете это сделать, так как свойство помечено модификатором readonly . Вместо этого moveX должна возвращать новый объект с изменёнными значениями:
Теперь компилятор будет счастлив, больше нет попыток присвоить значения свойствам помеченным readonly . Мы создали новый объект, который инициализируется с обновлёнными значениями.
Свойства класса, доступные только для чтения
Вы также можете применять модификатор readonly к свойствам описанным в классе. Здесь представлен класс Circle с readonly полем radius и и свойством area , которое косвенным образом реализует доступность только для чтения, потому что не имеет сеттера:
Обратите вниманием, что area вычисляется с помощью оператора возведения в степень. И radius , и area доступны извне класса для чтения, потому что ни один не помечен как private , но не для записи:
Доступные только для чтения поля интерфейсов
Поля интерфейсов также могут помечены, как доступные только для чтения. Например, тип ReadOnlyArray<T> предотвращает запись значений в описанные свойства:
Следующее присваивание будет невалидным:
readonly vs иммутабельность
Модификатор readonly — это часть системы типов TypeScript . Он используется только компилятором для проверки незаконных присваивании значений. Как только TypeScript код компилируется в JavaScript такое понятие, как readonly уходит прочь. Не поленитесь поиграть с маленьким примером, чтобы посмотреть во что компилируются свойства доступные только для чтения.
Так как модификатор readonly — это только артефакт при компиляции, он не является защитой от присваивания значений во время исполнения кода. Тем не менее это ещё одна особенность TypeScript , которая поможет вам писать правильный код, оставив компилятору работу по проверке непреднамеренных присвоений значений.
readonly¶
Система типов TypeScript позволяет помечать отдельные элементы интерфейса доступными только для чтения . Это позволяет вам работать в функциональном стиле (в котором неожиданные мутации это плохо):
Вы также можете использовать readonly в определениях interface и type , например:
Вы даже можете объявить свойство класса как readonly . Вы можете инициализировать их в момент объявления или в конструкторе, как показано ниже:
Тип Readonly¶
Существует тип Readonly , который принимает тип T и помечает все его элементы как readonly . Вот демонстрация использования этого на практике:
Различные варианты использования¶
ReactJS¶
ReactJS — это библиотека, которая любит иммутабельность, вы можете пометить ваши Props и State как неизменяемые, например:
Однако вам не нужно это делать, поскольку определения типов для React уже помечают их как readonly (внутренняя оболочка универсального типа соответствует типу Readonly , упомянутому выше). Поэтому, достаточно:
Обратно-совместимая иммутабельность¶
Вы даже можете пометить сигнатуры индекса только для чтения:
Это замечательно, если вы хотите использовать нативные массивы JavaScript в иммутабельном виде. На самом деле TypeScript поставляется с интерфейсом ReadonlyArray<T> , позволяющим вам сделать именно это:
Автоматический логический вывод¶
В некоторых случаях компилятор может автоматически делать предположение, что определенный элемент доступен только для чтения, например, внутри класса, если у вас есть свойство, у которого есть только геттер, но нет сеттера, оно предполагается только для чтения, например: