Type Guards: in и instanceof
Часть раздела Введение в TypeScript путешествия по JavaScript на Coddy. Урок 69 из 73.
При работе с объединениями типов (union types) вам часто нужно определить, с каким конкретно типом вы имеете дело, прежде чем вы сможете безопасно обращаться к свойствам или методам, специфичным для этого типа. Защитники типов (type guards) обеспечивают безопасный способ сужения типов во время выполнения.
Оператор in проверяет наличие свойства в объекте. Это особенно полезно, когда у вас есть объединение типов объектов с разными свойствами:
type Dog = { name: string; breed: string };
type Cat = { name: string; meow: () => void };
function petSound(pet: Dog | Cat) {
if ('breed' in pet) {
// Здесь TypeScript знает, что pet — это Dog
console.log(`${pet.name} is a ${pet.breed}`);
} else {
// Здесь TypeScript знает, что pet — это Cat
pet.meow();
}
}Оператор instanceof проверяет, был ли объект создан определенной функцией-конструктором или классом. Хотя мы еще не рассматривали классы, этот оператор полезен при работе со встроенными объектами JavaScript или пользовательскими классами:
function processValue(value: string | Date) {
if (value instanceof Date) {
// TypeScript знает, что value — это Date
console.log(value.getFullYear());
} else {
// TypeScript знает, что value — это string
console.log(value.toUpperCase());
}
}Оба оператора помогают компилятору TypeScript понять, с каким типом вы работаете, обеспечивая безопасный доступ к свойствам и методам, специфичным для конкретного типа.
Задание
ЛегкоСоздайте функцию, которая обрабатывает различные типы медиа-объектов, используя оператор in для их различения.
Создайте два псевдонима типов:
Movieсо свойствамиtitle(string) иdirector(string)Songсо свойствамиtitle(string) иartist(string)
Создайте функцию с именем getMediaInfo, которая:
- Принимает параметр
mediaтипаMovie | Song - Использует оператор
inдля проверки существования свойстваdirector - Возвращает
"Movie: [title] directed by [director]", если это фильм - Возвращает
"Song: [title] by [artist]", если это песня - Имеет явно указанный тип возвращаемого значения
string
Создайте вторую функцию с именем processValue, которая:
- Принимает параметр
valueтипаstring | Date - Использует оператор
instanceofдля проверки того, является лиvalueобъектомDate - Возвращает год в виде числа, если это Date (используя
getFullYear()) - Возвращает длину строки в виде числа, если это строка
- Имеет явно указанный тип возвращаемого значения
number
Создайте тестовые данные:
movie1:{ title: "Inception", director: "Christopher Nolan" }song1:{ title: "Bohemian Rhapsody", artist: "Queen" }movie2:{ title: "The Matrix", director: "The Wachowskis" }song2:{ title: "Imagine", artist: "John Lennon" }testDate:new Date("2023-12-25")testString:"TypeScript"
Выведите следующие результаты:
- Вызовите
getMediaInfoсmovie1 - Вызовите
getMediaInfoсsong1 - Вызовите
getMediaInfoсmovie2 - Вызовите
getMediaInfoсsong2 - Вызовите
processValueсtestDate - Вызовите
processValueсtestString
Попробуйте сами
// TODO: Напишите ваш код здесь
// Создайте псевдонимы типов для Movie и Song
// Создайте функцию getMediaInfo
// Создайте функцию processValue
// Создайте тестовые данные
const movie1 = { title: "Inception", director: "Christopher Nolan" };
const song1 = { title: "Bohemian Rhapsody", artist: "Queen" };
const movie2 = { title: "The Matrix", director: "The Wachowskis" };
const song2 = { title: "Imagine", artist: "John Lennon" };
const testDate = new Date("2023-12-25");
const testString = "TypeScript";
// Выведите результаты
console.log(getMediaInfo(movie1));
console.log(getMediaInfo(song1));
console.log(getMediaInfo(movie2));
console.log(getMediaInfo(song2));
console.log(processValue(testDate));
console.log(processValue(testString));В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в TypeScript
1Начало работы с TS
Что такое TypeScript?Зачем использовать TypeScript?Ваш первый код на TypeScriptПроцесс компиляции и ошибкиИтоги: Введение в TS4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация стрелочных функцийТип возвращаемого значения 'void'Необязательные параметры с '?'Значения параметров по умолчаниюТипизация Rest-параметровОпределение типов функцийИтоги: Создание типизированных функций2Основные типы
Базовые типы: str, num, booleanТип 'any': лазейкаТип 'unknown'Работа с 'null' и 'undef'Вывод типов в действииЯвные аннотации типовИтоги: Практика по основным типам5Типы: псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения ('|')Работа с типами объединенияЛитеральные типыТипы пересечения ('&')Комбинирование псевдонимов типовИтоги: продвинутые комбинации типов8Перечисления (Enums)
Что такое числовое перечисление?Использование числовых перечисленийЧто такое строковое перечисление?Использование строковых перечисленийГетерогенные перечисленияИтоги: использование перечислений11Продвинутые темы
Утверждения типовType Guards: in и instanceofТип 'never'Nullable-типы ('strictNull')Индексные сигнатуры для объектовИтоги: Тонкая настройка типов3Структуры данных: массивы и кортежи
Типизированные массивыМодификатор 'readonly' для массивовЧто такое кортеж?Объявление кортежей и доступ к нимДеструктуризация кортежейКортежи readonlyМногомерные типизированные массивыОператор spread с массивамиИтоги: массивы и кортежиПотренируйтесь самостоятельно: Онлайн-компилятор JavaScript