Обобщения
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)
В данном случае вне зависимости от типа данных, переданных в массиве, все его элементы соединятся в одну общую строку.
Вопросы
Для чего используется тип any?
- Принимает любые типы
- Принимает любые числа
- Принимает любые символы
Можно ли использовать результат функции как объект того типа, который передан в функцию?
- Да
- Нет
Ссылки:
Contributors ✨
Thanks goes to these wonderful people (emoji key):
Philipp Dvinyaninov | Dmitriy Vasilev 💵 |