В TypeScript есть удобный инструмент – type assertion, или приведение типа через
as.Например:
const user = getData() as User;
На первый взгляд может показаться, что мы “преобразовали” данные в тип
User. Но на самом деле это не так.as не меняет данные и не проверяет их структуру во время выполнения программы. Он только сообщает TypeScript, что мы хотим рассматривать значение как определённый тип.Иными словами, мы говорим компилятору:
> “Считай, что это User. Я беру ответственность на себя”.
Из-за этого
as может скрыть реальную ошибку.Например:
type User = {
name: string;
age: number;
};
const data = JSON.parse('{"name": "Aram"}') as User;
console.log(data.age.toFixed());
TypeScript не покажет ошибку, потому что мы явно указали тип
User. Но в реальных данных поля age нет, поэтому код упадёт во время выполнения.Поэтому важно помнить:
as не делает код безопаснее. Он лишь отключает часть проверки типов в конкретном месте.Особенно осторожно стоит использовать
as, когда данные приходят извне: с сервера, из localStorage, из JSON.parse или из сторонних библиотек.Более надёжный подход — сначала проверить структуру данных, а уже потом работать с ними как с нужным типом:
function isUser(value: unknown): value is User {
return (
typeof value === 'object' &&
value !== null &&
'name' in value &&
'age' in value
);
}
const data: unknown = JSON.parse(json);
if (isUser(data)) {
console.log(data.age);
}
В этом случае TypeScript понимает, что внутри блока
if значение действительно можно считать User.Использовать его можно, но лучше делать это осознанно. Особенно там, где данные приходят из внешнего источника и могут не соответствовать ожидаемой структуре.