मुख्य कंटेंट तक स्किप करें

Обобщения

TypeScript является строго типизированным языком, однако иногда надо построить функционал так, чтобы он мог использовать данные любых типов. В некоторых случаях мы могли бы использовать тип any:

Пример

let getId = (id: any): any => id
let result = getId(5)
console.log(result)

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

function getId<T>(id: T): T {  return id}

С помощью выражения <T> мы указываем, что функция getId типизирована определенным типом T. При выполнении функции вместо Т будет подставляться конкретный тип. Причем на этапе компиляции конкретный тип не известен. И возвращать функция будет объект этого типа.

Пример

function getId<T>(id: T): T {  return id}
let result1 = getId<number>(5)console.log(result1)
let result2 = getId<string>('abc')console.log(result2)

В первом случае вместо параметра T будет испльзоваться тип number, поэтому в функцию мы можем передать число. Во втором случае вместо T используется тип string, поэтому во втором случае можно передать строку. Таким образом, мы можем передать в функцию объекты различных типов, но при этом сохраняется строгая типизация, каждый вариант обобщенной функции может принимать объекты только определенного типа.

Подобным образом еще можно использовать обобщенные массивы:

Пример

function getString<T>(arg: Array<T>): string {  let result = ''  for (let i = 0; i < arg.length; i++) {    if (i > 0) result += ','    result += arg[i].toString()  }  console.log(result)  return result}
let result = getString<number>([1, 2, 34, 5])console.log(result)

В данном случае вне зависимости от типа данных, переданных в массиве, все его элементы соединятся в одну общую строку.

Вопросы#

Question

Для чего используется тип any?

  1. Принимает любые типы
  2. Принимает любые числа
  3. Принимает любые символы

Можно ли использовать результат функции как объект того типа, который передан в функцию?

  1. Да
  2. Нет

Ссылки:#

  1. TypeScript документация
  2. Metanit
  3. Canonium

Contributors ✨#

Thanks goes to these wonderful people (emoji key):


Philipp Dvinyaninov

📖

Dmitriy Vasilev

💵

Become a Patron!