Ответ
Альтернативы any в TypeScript
Для типизации "любого значения" лучше избегать any и использовать более безопасные альтернативы:
unknown- требует явной проверки типа перед использованием
function safeParse(data: unknown) {
if (typeof data === 'string') {
return JSON.parse(data);
}
return data;
}
- Типы-объединения (
|) - когда известны возможные варианты
function formatInput(input: string | number) {
// ...
}
- Дженерики - для сохранения информации о типе
function identity<T>(arg: T): T {
return arg;
}
- Type Assertions (только когда точно уверены в типе)
const someValue: unknown = "hello";
const strLength = (someValue as string).length;
- Интерфейсы/Типы - для сложных структур с частично известными типами
Ответ 18+ 🔞
Слушай, а вот этот твой any в TypeScript — это как взять и натянуть презерватив на голову, а не на хуй. Вроде защита есть, а толку — нихуя, всё равно всё протекает. Все эти ошибки, которые мы типа ловим системой типов, они просто проходят мимо, как будто их и не было.
Так вот, есть варианты поумнее, чтобы не быть полным распиздяем в коде.
1. unknown — наш строгий, но справедливый отец.
Это как если бы тебе дали запечатанную коробку и сказали: "Чувак, там что-то есть, но пока не посмотришь, что именно — не лезь". Надо явно проверить, что внутри, и только потом использовать. Иначе компилятор тебе мозги выест.
function safeParse(data: unknown) {
// Сразу в лоб не суйся, проверь тип!
if (typeof data === 'string') {
return JSON.parse(data); // Вот теперь всё чики-пуки
}
return data; // А если не строка, ну и похуй, верни как есть
}
2. Типы-объединения (|) — когда вариантов несколько, но не дохуя.
Ты примерно знаешь, что может прилететь. Не "что угодно", а, допустим, строка ИЛИ число. Как будто тебе в дверь либо почтальон зайдёт, либо сосед с бутылкой. На оба случая ты как-то готов.
function formatInput(input: string | number) {
// Тут уже можно подумать, как с каждым типом работать
}
3. Дженерики (T) — для хитрожопых, которые хотят сохранить тип.
Ты как бы говоришь системе: "Слушай, я пока не знаю, что это будет, но когда узнаю — ты запомнишь это нахуй и проследишь за мной". Тип передаётся сквозь функцию, как фамильная ценность.
function identity<T>(arg: T): T {
return arg; // Что пришло, то и ушло, без подмен и хуйни
}
4. Type Assertions (as) — когда ты на 146% уверен, а компилятор тупит.
Это как крикнуть: "Да я ж блядь знаю, что это строка, отъебись!". Опасная штука, можно ебнуться, если ошибёшься. Используй только когда приперло.
const someValue: unknown = "hello";
// Говорим TypeScript: "Расслабься, это строка, я в глаз себе тыкну, если не так"
const strLength = (someValue as string).length;
5. Интерфейсы/Типы — для сложных структур, где не всё известно.
Иногда объект приходит, и ты знаешь только пару ключей, а остальное — тёмный лес. Так и опиши: "Вот эти поля я жду, а на остальное мне похуй, пусть будет unknown".
Короче, суть в чём: any — это капитуляция, белый флаг, признание своего поражения. А эти альтернативы — они хоть и требуют подумать башкой, но зато не дают тебе в продакшене нечаянно сложить строку с хуём и получить 'HelloWorld[object Object]undefined'. Доверяй, но проверяй, блядь.