TypeScript — отличный способ добавить намерения в ваш код JavaScript и приложения. Возможность явно определять типы переменных при объявлении переменных — отличный способ избежать конфликтов типов позже в вашем коде. Хотя это просто с примитивными типами, такими как числа и строки, не так ясно, как это реализовать, когда речь идет о таких объектах, как массивы.

В этой статье мы рассмотрим, как создавать массивы TypeScript, в частности, можно ли создавать массивы смешанного типа.

Создание массивов в TypeScript

Массивы TypeScript отлично подходят для того, чтобы гарантировать, что вы не получите случайные типы данных в своем массиве. Чтобы определить тип массива, вы можете сделать следующее:

Синтаксис для создания массива TypeScript заключается в том, чтобы назвать вашу переменную, а затем добавить ‹element-type›[], чтобы объявить тип. Это можно использовать для любого примитивного типа JavaScript, как мы видели выше, с числами, строками и даже элементами HTML.

Вы, наверное, заметили, что все эти объявления относятся к одному типу. Это полезно для обеспечения того, чтобы в наш массив не попадали никакие типы, кроме объявленного типа, но что, если нам нужен другой тип? Возможно ли иметь массив TypeScript с несколькими типами?

Как использовать операторы объединения

Сначала я думал, что это невозможно. После продолжительного чтения документации по TypeScript мне еще предстояло увидеть, как можно объявить тип массива, допускающий несколько типов. Затем я нашел оператор объединения.

Если вы не знакомы, оператор union — это инструмент, используемый для обеспечения строгости проверки типов TypeScript, при этом обеспечивая гибкость нескольких типов из белого списка. Это полезно, если ваш ввод может быть целым числом или строкой, и вы хотите иметь возможность присвоить их переменной myNumber.

Вот пример оператора объединения, используемого для аргументов функции, чтобы разрешить строковые «числа» перед отображением подтверждения или сообщения об ошибке:

Здесь мы позволяем функции принимать либо числа, либо строки в случае, если кто-то передает «1» вместо 1. Затем мы можем использовать дополнительные проверки типов, чтобы убедиться, что данное нам значение допустимо.

Смешивание типов в массивах TypeScript

Теперь, когда мы рассмотрели присваивание типов с одним аргументом с помощью операторов объединения, давайте посмотрим, как использовать операторы объединения с массивами. Ниже у меня есть пример кода из игры Hangman, которую я создал на TypeScript:

Здесь я хотел создать отображение ввода, которое добавлялось бы в DOM всякий раз, когда я переключался между этапами игры. Я использовал TypeScript для установки типов каждого из создаваемых мной элементов DOM, а затем помещал их в массив inputChildren, чтобы облегчить итерацию вставки.

Это работает, но я не использую TypeScript в полной мере, чтобы гарантировать, что inputChildren получает только правильные типы элементов. Чтобы исправить это, мы можем использовать оператор union для внесения в белый список типов, которые могут быть приняты в наш массив. После рефакторинга создания моего массива я получил этот код, в котором явно указано, какие типы переменных должны быть разрешены в нашем массиве:

Намного лучше!

Заключение

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

Примечания

https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes-func.html#unions

https://stackoverflow.com/questions/29382389/defining-array-with-multiple-types-in-typescript

https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html