TGStat
TGStat
Qidiruv uchun matnni kiriting
Ilg‘or kanal qidiruvi
  • flag Uzbek
    Sayt tili
    flag Russian flag English flag Uzbek
  • Saytga kirish
  • Katalog
    Kanal va guruhlar katalogi Hududiy to‘plamlar Tematik to‘plamlar Платные каналы Kanallar qidiruvi
    Kanal/guruh qo‘shish
  • Reytinglar
    Kanallar reytingi Guruhlar reytingi Postlar reytingi
    Brendlar va shaxslar reytingi
  • Analitika
  • Postlarda qidiruv
  • Telegram'ni kuzatish
  • Targ‘ibot
    Yandex Business orqali reklama Реклама в каналах через TGStat Agency Реклама на сайте TGStat.ru
Кодовая база

8 Jul, 11:03

Telegram'da ochish Ulashish Shikoyat qilish

И снова Infer

По вашим просьбам сегодня разберем еще пример с infer. Я покажу, какие умозаключения я делаю, когда описываю типы при помощи этого ключевого слова.

▶️Задача: вывести тип первого аргумента функции.

const logUser = (user: 'user' | 'admin', lastLogin: Date) => {...}  // 'user' | 'admin';

const repeatChat = (count: number, char: string) => {...} // number

const getStringLength = (str: string) => {...} // string

Заметим, что в функции может быть сколько угодно аргументов, но нас интересует только первый. Поэтому имеет смысл разбить аргументы на две группы: первый и все остальные, которые нас не интересуют. В JavaScript есть очень удобный оператор rest, который позволяет нам собрать все неинтересные нам аргументы в кучу. 

Давайте для примера попробуем описать тип Func, которым можно описать все наши функции из примера выше, и пока будем использовать везде any. Наша задача — просто побить сигнатуру на логические группы. В параметрах выделим сначала первый x (он-то нам и интересен), затем все остальные аргументы соберем в параметр rest. Вернем any — мы договорились пока что везде использовать any. У меня получилось так:

type Func = (x: any, ...rest: any) => any;

Теперь, глядя на этот шаблон, легко поставить infer туда, куда нам интересно. Псевдокодом получится вот так:

type Func = (x: infer U, ...rest: any) => any;


Осталось написать наш тип-дженерик по общему алгоритму: проверяем, соответствует ли параметр типа нашему шаблону, если да, возвращаем интересный нам U, иначе never.

type FirstArg =
  T extends (x: infer U, ...args: any) => any
    ? U
    : never;

#typescript

🔜 Канал в MAX

932 0 3 5 14
Katalog
Kanal va guruhlar katalogi Kanallar to‘plamlari Kanallar qidiruvi Kanal/guruh qo‘shish
Reytinglar
Telegram-kanallar reytingi Telegram-guruhlar reytingi Postlar reytingi Brendlar va shaxslar reytingi
API
Statistika API'si Postlar qidiruvi API'si API Callback
Kanallarimiz
@TGStat @TGStat_Chat @telepulse @TGStatAPI
O‘qish
Академия TGStat Telegram tadqiqoti 2019 Telegram tadqiqoti 2021 Telegram tadqiqoti 2023
Kontaktlar
Справочный центр Qo‘llab-quvvatlash Email Vakansiyalar
Har xil narsalar
Foydalanuvchi shartnomasi Maxfiylik siyosati Ommaviy oferta
Botlarimiz
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot