Машинопись делает нашу жизнь намного проще. Он привносит концепции ООП в javascript и помогает нам писать лучший код. Среди других функций, которые предлагает нам Typescript, есть менее знакомая - общие типы.

Что такое универсальные типы? Когда и зачем мне его использовать?

Эта проблема:

Самая распространенная функция в Typescript - это, в общем, определенные типы. возьмем для примера этот простой код:

Мы создали функцию под названием echo, которая получает аргумент и возвращает его. Эта функция может получать все типы. Она будет работать, если вы передадите строку, число, объект и т. Д. Итак, если мы хотим добавить какой-нибудь Typescript, мы можем добавить тип «любой», чтобы компилятор знал, что он может получить все виды типы.

Мы добавили тип any в качестве типа аргумента и типа возвращаемого значения функции echo и действительно тип ответа функции - 'любой'. Когда мы смотрим на функцию, мы можем очень легко заметить, что если мы передадим строку, функция вернет строку, а если мы передадим число, она вернет число, и то же самое происходит для всех типов. Поскольку мы определили тип возвращаемого значения как «любой» (или иногда мы не определяем его вообще), мы теряем ценные данные о типе результата функции.

TypeScript создан для того, чтобы защитить нас от ошибок типа. В качестве примера возьмем метод trim (), который действителен только для строк:

При вызове метода echo () с 1 в качестве аргумента мы не увидим никакой ошибки типа, потому что в машинописном тексте 'res' определяется как ' любой '. Но когда мы строго определили переменную «numericValue» как число, мы получим предупреждение машинописного текста «Свойство« trim »не существует для типа« 1 »».

Итак, как мы можем защитить себя от таких сценариев? Как мы можем сказать Typescript, какой именно тип возвращает функция echo?

Решение:

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

Мы добавили ‹T› сразу после названия метода. T - это заполнитель, который теперь можно использовать как тип аргумента и как тип возвращаемого значения функции. Почему это хорошо? Вы заметили, что теперь тип аргумента и тип возвращаемого значения относятся к типу T? Что ж, Typescript замечает это, и теперь компилятор знает, что тот же тип, который был передан в качестве аргумента, является типом, который, как ожидается, будет возвращен функцией.

Теперь, если мы попытаемся передать числовое значение функции echo и вызовем trim (который работает только для строк) , компилятор выполнит выдает ошибку, а если вы передадите строку, вы не увидите ошибок.

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

Когда следует использовать дженерики?

Мы узнали, что такое дженерики и что они нам дают. В реальных случаях типы обычно известны заранее, поэтому вы можете (и должны) их использовать.

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

Пример кода доступен в StackBlitz, так что вы можете увидеть живой пример универсальных типов.

Универсальные типы также могут использоваться с классами. Я написал еще одну статью, посвященную этой теме.