Menu
Coddy logo textTech

Необязательные и Readonly свойства

Часть раздела Введение в TypeScript путешествия по JavaScript на Coddy. Урок 41 из 73.

TypeScript предоставляет два мощных модификатора, которые дают вам этот контроль: модификатор необязательного свойства и модификатор readonly.

Символ ? делает свойство необязательным, что означает, что оно не обязательно должно присутствовать при создании объекта. Это полезно для свойств, которые могут понадобиться не всегда:

interface User {
  name: string;
  email?: string;  // Необязательное свойство
}

let user1: User = { name: "Alice" };  // Валидно — email необязателен
let user2: User = { name: "Bob", email: "bob@example.com" };  // Также валидно

Модификатор readonly предотвращает изменение свойства после создания объекта. Это идеально подходит для свойств, которые должны оставаться неизменными, таких как уникальные идентификаторы:

interface Product {
  readonly id: number;  // Нельзя изменить после создания
  name: string;
}

let product: Product = { id: 1, name: "Laptop" };
product.name = "Gaming Laptop";  // Допустимо
// product.id = 2;  // Ошибка: Невозможно присвоить значение 'id', так как оно предназначено только для чтения

Вы можете комбинировать оба модификатора в одном интерфейсе, и эти модификаторы работают одинаково как с интерфейсами, так и с псевдонимами типов, обеспечивая точный контроль над структурами ваших объектов.

challenge icon

Задание

Легко

Создайте интерфейс с именем Book со следующими свойствами:

  • title типа string (обязательное)
  • isbn типа string (только для чтения - readonly)
  • subtitle типа string (необязательное)
  • pages типа number (обязательное)
  • publishedYear типа number (только для чтения - readonly)
  • genre типа string (необязательное)

Создайте интерфейс с именем Magazine со следующими свойствами:

  • name типа string (обязательное)
  • issueNumber типа number (только для чтения - readonly)
  • topic типа string (необязательное)
  • monthlySubscription типа boolean (обязательное)

Используя ваши интерфейсы, создайте следующие переменные:

  • Создайте переменную с именем novel типа Book с title "1984", isbn "978-0-452-28423-4", pages 328 и publishedYear 1949
  • Создайте переменную с именем cookbook типа Book с title "The Joy of Cooking", isbn "978-0-7432-4626-2", subtitle "All About Baking", pages 1132, publishedYear 2006 и genre "Cooking"
  • Создайте переменную с именем techMag типа Magazine с name "Tech Today", issueNumber 45 и monthlySubscription true
  • Создайте переменную с именем scienceMag типа Magazine с name "Science Weekly", issueNumber 12, topic "Climate Change" и monthlySubscription false

Создайте функцию с именем getBookDetails, которая принимает параметр типа Book и возвращает string. Функция должна возвращать название книги и количество страниц в формате "[title] - [pages] pages".

Создайте функцию с именем getMagazineInfo, которая принимает параметр типа Magazine и возвращает string. Функция должна возвращать название журнала и номер выпуска в формате "[name] Issue #[issueNumber]".

Выведите следующие результаты в отдельных строках:

  • Вызовите getBookDetails с аргументом novel и выведите результат
  • Вызовите getBookDetails с аргументом cookbook и выведите результат
  • Вызовите getMagazineInfo с аргументом techMag и выведите результат
  • Вызовите getMagazineInfo с аргументом scienceMag и выведите результат
  • Выведите ISBN переменной novel
  • Выведите статус подписки techMag (свойство monthlySubscription)

Попробуйте сами

// TODO: Напишите свой код здесь

// Создайте интерфейс Book

// Создайте интерфейс Magazine

// Создайте переменные, используя ваши интерфейсы

// Создайте функцию getBookDetails

// Создайте функцию getMagazineInfo

// Выведите требуемые результаты
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Введение в TypeScript

Потренируйтесь самостоятельно: Онлайн-компилятор JavaScript