Замените ключевое слово any, чтобы использовать строгую типизацию

Чтобы привыкнуть к TypeScript, может потребоваться некоторое время, особенно если у вас плохо типизированный фон, такой как JavaScript.

В погоне за гибкостью простой способ - просто отказаться от борьбы и использовать ключевое слово any . И, возможно, иногда это может быть (почти) правильный выбор, но чаще всего можно избежать использования ключевого слова any и заменить его более подходящим типом.

Наша цель всегда должна заключаться в генерировании ошибок во время компиляции, а не в их возникновении во время выполнения. Используя TypeScript, мы можем соответствовать принципу отказоустойчивости.

Типы союза

Один из самых простых вариантов использования, с которыми вы сталкиваетесь и который побуждает вас использовать любой, - это когда вы пишете функцию, которая принимает несколько типов.

Скажем, например, вы пишете функцию, которая устанавливает ширину элемента. Вы хотите, чтобы эта ширина предоставлялась либо в виде строки, заканчивающейся ее единицами измерения (например, px), либо ваша функция может принимать число.

Поскольку тип аргумента, который принимает ваша функция, является одним из нескольких типов, вы можете по ошибке использовать any, и это будет выглядеть примерно так:

Очевидно, что это не помогает нам с безопасностью типов, все можно передать функции.

Здесь на помощь приходят профсоюзы!

Используя вертикальную черту, мы можем комбинировать разные типы, после наших typeof проверок (защита типов) TypeScript автоматически обнаруживает, что теперь мы имеем дело со строкой или числом соответственно. Это также дает нам большие дополнительные преимущества с автозаполнением и другими функциями IntelliSense.

Обработка массивов

Рассмотрим следующую функцию, которая принимает массив и сопоставляет каждый элемент его длине. Элементы внутри массива могут быть строками или другими массивами, но числа могут вызвать ошибку во время выполнения, поскольку у них нет атрибута длины.

Итак, как мы можем улучшить этот пример и избавиться от типа any? Наш единственный критерий - это то, что наш параметр array представляет собой массив, содержащий элементы с атрибутом длины.

Итак, наш объект может иметь другие атрибуты, но Typescript позволяет нам проверять только часть объекта. Мы просто просим, ​​чтобы array был списком, но также, чтобы каждый элемент содержал по крайней мере атрибут длины номера типа.

Это сразу же делает наш код не только более надежным, но и более понятным.

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

Использование универсальных шаблонов

Но что, если у нас есть функция, которая принимает массив элементов любого типа и превращает их в объект, содержащий их индекс в массиве. Используя any, это могло бы выглядеть примерно так:

Проблема становится сразу видна в приведенном выше примере: поскольку мы используем any, после вызова функции мы теряем информацию о типе.

Но на этот раз нас действительно не волнует, что получает наша функция, но мы не хотим возвращать any. Используя дженерики TypeScript, мы можем решить эту проблему:

Неизвестно Больше любого

Если вы окажетесь в ситуации, когда приведенные выше советы не подходят для вашего варианта использования, вам все равно не следует использовать any! Тип unknown и его преимущества часто упускаются из виду.

Проблема с any в том, что он позволяет нам выполнять любые операции, которые мы пожелаем. unknown - это типобезопасный аналог, который заставляет разработчика добавлять проверки (защиты типов) или приводить переменную перед использованием.

Некоторые типичные проверки включают операторы instanceof и typeof. Еще один элегантный способ справиться с unknown или объединенными типами - это использовать средства защиты определяемых пользователем типов, которые в этой статье не обсуждаются.

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

Я надеюсь, что эта статья позволит вам избавиться от типа any в ваших будущих проектах и ​​повысить безопасность типов. Спасибо за прочтение!

Все примеры доступны на этой игровой площадке TypeScript.