Вопрос проверяет понимание того, как TypeScript обрабатывает проверки типов во время выполнения программы, а не только на этапе компиляции.
TypeScript — это надстройка над JavaScript, которая добавляет статическую типизацию. Однако после компиляции в JavaScript вся информация о типах удаляется. Это означает, что TypeScript не предоставляет встроенных механизмов для проверки типов во время выполнения программы. Разработчикам приходится реализовывать такие проверки самостоятельно.
Самый распространенный способ — это создание функций, которые проверяют структуру данных и возвращают логическое значение с указанием типа. Такие функции называются type guards. Они используют ключевое слово is в возвращаемом типе.
interface Cat {
meow(): void;
}
interface Dog {
bark(): void;
}
function isCat(pet: Cat | Dog): pet is Cat {
return (pet as Cat).meow !== undefined;
}
function handlePet(pet: Cat | Dog) {
if (isCat(pet)) {
pet.meow(); // TypeScript знает, что pet — Cat
} else {
pet.bark(); // TypeScript знает, что pet — Dog
}
}Другой подход — использование discriminated unions (различающихся объединений). Это когда каждый объект в объединении имеет общее свойство (дискриминант) с уникальным литеральным типом. TypeScript может сузить тип на основе значения этого свойства.
type Shape =
| { kind: 'circle'; radius: number }
| { kind: 'square'; side: number };
function area(shape: Shape): number {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2;
case 'square':
return shape.side ** 2;
}
}Для более сложных сценариев существуют библиотеки, такие как zod или io-ts. Они позволяют определять схемы данных и проверять их во время выполнения, автоматически выводя типы TypeScript.
import { z } from 'zod';
const UserSchema = z.object({
name: z.string(),
age: z.number().positive(),
});
type User = z.infer<typeof UserSchema>;
const data = JSON.parse('{"name":"Alice","age":30}');
const user = UserSchema.parse(data); // выбросит ошибку, если данные невалидныRuntime-проверки в TypeScript необходимы для валидации данных, поступающих из внешних источников (API, пользовательский ввод). Используйте type guards для простых случаев, discriminated unions для работы с объединениями типов, и библиотеки вроде zod для сложных схем. Это повышает надежность приложения и предотвращает ошибки, связанные с некорректными данными.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию