Спасибо большое, ты просто лучший. Несколько дней не мог понять что такое infer и зачем он нужен, кучу всего перечитал до этого. А тут меньше 10ти минут и до меня наконец-то дошло это и не только
Вот именно эти вещи в ТС я и считаю дичью! Нечитабельно, какие-то условия в условиях, на генериках, с кучей скобочек - оверинжиниринг с типами. Надо долго в это вникать, и научиться читать такие вложенности. И тут еще просто))) Я такие выкрутасы видел на ТС, чтомозг плавится.
8:38 а тут я не понял зачем ты использовал `T extends infer U ? ...` почему бы просто не написать: type GetStatus = T extends {status: any} ? T['status'] : null; есть какая-то разница разве?
И это было охуенно! Приправил где нужно jsdoc и профит. Теперь кроме багов в коде еще и фиксить баги в типах, которые высосанные из пальца и пока проберешься среди дебрей дженериков, забудешь и логику кода, которой выходит иногда меньше, чем типов.
Спасибо, ибо это действительно сложно, мало где понятно и коротко объяснено, "спрашиваемо" на собесах, видано в кучках популярных либ, но не особо "используемо"))))))))) 👍👍👍👍👍👍👍👍👍👍👍👍👍👍
Я тоже месяц назад начал учить его, как ты говоришь эти моменты понятны а так как автор делает конечно сам сразу не додумаешься. И вообще тс призван облегчить жизнь разрабам, а в итоге я голову ломаю)))
Не очень понял infer на примере type GetStatus = T extends infer U ? U extends {status: any} ? U['status'] : null : null; Чем это отличается от просто? type GetStatus = T[keyof T];
2:30 Имхо не лучший пример :с Ибо гораздо лакончинее было бы сделать так: function getId(obj: T): T['id'] { return obj.id; } (я использовал тут ещё unknown вместо any но в данном случае разницы особо нет, но я предпочитаю unknown вместо any, когда это возможно) либо можно так ещё, с использованием infer: function getId(obj: T): T extends {id: infer K} ? K : never { return obj.id; } но считаю что мой второй пример плохой ибо проще и лучше сделать без infer
Очень интересно но ничего не понятно. А есть где-то более практические задачки. Чтобы можно было запустить и копопаться. На ангуларе например и чтобы все - интерфейсы, женерики, условныте типы.
Не могу понять, зачем писать: ```type TryInfer = T extends infer R ? R[keyof R] : never;``` Если можно просто написать: ```type TryInfer = T[keyof T]``` ???
Какой смысл в этой конструкциии: T extends infer U ? . Немного переписал твои примеры для наглядности: type GetStatus0 = T extends object ? T extends { status : any} ? T['status'] : null : undefined type GetStatus1 = T extends infer U ? U extends { status : any} ? U['status'] : null : undefined type Status0 = GetStatus0 // typeOf Status0 - undefined type Status1 = GetStatus1 // typeOf Status1 - null, в undefined не свалюсь, какой бы тип не передал кроме never any unknown
Только начал познавать TS (входит в стэк куда хочу на работу устроится) и вроде бы все понятно когда работаешь со своими объектами или переменными, но когда с разных api прилетает кто во что горазд, то туплю и не понимаю как описать, вроде понятно что условными типами а толком не могу разобраться(
Добрый всем вечер! type T = A extends [infer U, 1] | [1, infer U] ? U : never; type F = T; У F тип 2 | 1 type T = A extends [infer U, 1] | [1, infer U, infer U] ? U : never; type F = T; У F тип 2 | 3, но исходя из первого примера должен быть 2 | 3 | 1 Но это почему-то не так... Как вообще понимать такое поведение?
@@wisejs Не совсем понятно, почему в первом примере тип F 2 | 1, если тогда по идее должно быть 1 | 2... И почему в первом примере появляется 1, если кортеж [1, 2] в принципе не может расширить кортеж [infer U, 1]? Объясните, пожалуйста, что именно прям в деталях происходит внутри компилятора TS, как он вообще обрабатывает инструкцию A extends [infer U, 1] | [1, infer U] ? U : never ? Просто в моем понимании если у нас аргументом дженерика попал тип [1, 2], то мы должны той инструкцией проверить, расширяет ли тип [1, 2] тип [infer U, 1] | [1, infer U... Истинность того, что расширяет, вытекает из подтипа [1, infer U], поэтому мы в U записываем 2... А откуда потом берется 1 я прям реально не могу понять... ((
Программисты на C# или Java молча наблюдают как TypeScript стреляет себе в ногу ))) С лексической стороны, подобные конструкции это - самое уродливое ООП, которое я когда-либо видел. Тот случай когда костыли становятся просто не читаемыми.
Материал очень интересный и хорошо подаётся! Огромная благодарность за труд!
Спасибо большое, ты просто лучший. Несколько дней не мог понять что такое infer и зачем он нужен, кучу всего перечитал до этого. А тут меньше 10ти минут и до меня наконец-то дошло это и не только
То же самое. Несколько раз читал докуму, периодически к ней возвращаясь, но так и не мог понять с этим infer... А тут всё доходчиво и понятно
Вот такие видео нужны на Ютубе, спасибо!
Спасибо за поддержку!
Супер,лаконично и информативно,большое спасибо ! Условные типы,TypeScript, Infer, Conditional Types.
спасибо за поддержку))
Спасибо автору. Лучшее объяснение из всех, что видел. Человек понимает, что говорит.
Вот именно эти вещи в ТС я и считаю дичью!
Нечитабельно, какие-то условия в условиях, на генериках, с кучей скобочек - оверинжиниринг с типами.
Надо долго в это вникать, и научиться читать такие вложенности.
И тут еще просто))) Я такие выкрутасы видел на ТС, чтомозг плавится.
хотел написать коммент, но ты опередил)
Со временем ты станешь лучше к этому относиться
Когда то и reduce вызвал к сложности, правда?
@@Script696руль в автомобиле тоже можно ногами крутить, а к педалям приделать палки и давить на них руками, всего лишь надо к этому привыкнуть.
Банальное озвучивание справки... главное так и не озвучено: практическое применение. Где и когда это может понадобиться? Для чего используется?
лучшие уроки на ютуб, что я находил
Братче, ты просто красава! Всё доходчиво и понятно, мне не хватало этого видео
Незаслуженно мало подписчиков, материал реально годный) Infer, conditional types - огонь ))
Хорошо рассказал про TypeScript Infer Conditional Types
Infer, typescript, conditional types - спасибо за примеры
8:38
а тут я не понял зачем ты использовал `T extends infer U ? ...`
почему бы просто не написать:
type GetStatus = T extends {status: any} ? T['status'] : null;
есть какая-то разница разве?
я вообще не понял какая практическая польза от этого
Респект за условные типы, все понятно. Но infer очень сумбурно объяснил, я все еще не понял, что именно оно делает, и как и зачем )
Спасибо. Полезно когда нет возможности получить типы, но хочется полной типизации
Отличный урок, спасибо за труд!
Действительно классный канал, очень понятно объясняешь. Подписчиков мало. Надеюсь в какой то момент выстрелит. Спасибо!
Помнится были функции коротенькие и понятные. Но появился тайпскрипт и эти функции разрослись до 5 страниц. Но багов меньше нестало)
Да, это правда.
И это было охуенно! Приправил где нужно jsdoc и профит. Теперь кроме багов в коде еще и фиксить баги в типах, которые высосанные из пальца и пока проберешься среди дебрей дженериков, забудешь и логику кода, которой выходит иногда меньше, чем типов.
Круто, не знал о таких фишках)
Спасибо, ибо это действительно сложно, мало где понятно и коротко объяснено, "спрашиваемо" на собесах, видано в кучках популярных либ, но не особо "используемо"))))))))) 👍👍👍👍👍👍👍👍👍👍👍👍👍👍
работаю с тайп скриптом месяцев 5, но такую навороченную жесть пока не умею писать) Максимум самые простые дженерики, Пики, Омиты, Экстенды и т.д.
Я тоже месяц назад начал учить его, как ты говоришь эти моменты понятны а так как автор делает конечно сам сразу не додумаешься. И вообще тс призван облегчить жизнь разрабам, а в итоге я голову ломаю)))
@@777KoroL777 Ага, потому что ТС - дичь!
@@777KoroL777 сначала ты работаешь на TS, потом TS работает на тебя)
Топ! Спасибо огромное автору!
В примере с TryInfer, зачем вообще infer? Можно напрямую получить тип как T[keyof T], разве нет?
Спасибо за infer!
Всё доходчиво👍
крутое видео, спасибо большое. жаль, что больше не снимаете(
Отлично объяснил.
Не очень понял infer на примере
type GetStatus = T extends infer U ? U extends {status: any} ? U['status'] : null : null;
Чем это отличается от просто?
type GetStatus = T[keyof T];
Какая-то черная магия. Надо вникать. :)
2:30
Имхо не лучший пример :с
Ибо гораздо лакончинее было бы сделать так:
function getId(obj: T): T['id'] {
return obj.id;
}
(я использовал тут ещё unknown вместо any но в данном случае разницы особо нет, но я предпочитаю unknown вместо any, когда это возможно)
либо можно так ещё, с использованием infer:
function getId(obj: T): T extends {id: infer K} ? K : never {
return obj.id;
}
но считаю что мой второй пример плохой ибо проще и лучше сделать без infer
👉 Этот комментарий создан в качестве уважения автору и для продвижения его канала.
спасибо за infer, закрепил
спасибо за контент, но вы точно фронтенд разработчик? )) у вас оч давно не обновлялся браузер )
отличные видео по typescript у тебя, а можешь плиз запилить видео react с typescript
Кажется, таких видео уже десятки. Что именно интересно?
Хорошие видосы, но мало!
Очень интересно но ничего не понятно.
А есть где-то более практические задачки. Чтобы можно было запустить и копопаться. На ангуларе например и чтобы все - интерфейсы, женерики, условныте типы.
Не могу понять, зачем писать:
```type TryInfer = T extends infer R ? R[keyof R] : never;```
Если можно просто написать:
```type TryInfer = T[keyof T]```
???
Какой смысл в этой конструкциии: T extends infer U ? . Немного переписал твои примеры для наглядности:
type GetStatus0 = T extends object ? T extends { status : any} ? T['status'] : null : undefined
type GetStatus1 = T extends infer U ? U extends { status : any} ? U['status'] : null : undefined
type Status0 = GetStatus0 // typeOf Status0 - undefined
type Status1 = GetStatus1 // typeOf Status1 - null, в undefined не свалюсь, какой бы тип не передал кроме never any unknown
Смысл - заставить тайпскрипт распознать тип
@@wisejs Смысл - сломать себе мозг)))
Смысла никакого. Всё то же самое можно проще:
type GetStatus = T extends {status : unknown} ? T['status'] : undefined;
крутяк
Только начал познавать TS (входит в стэк куда хочу на работу устроится) и вроде бы все понятно когда работаешь со своими объектами или переменными, но когда с разных api прилетает кто во что горазд, то туплю и не понимаю как описать, вроде понятно что условными типами а толком не могу разобраться(
Если Вы не пишите свой интерпретатор, то Вам этот сахар не нужен.
Добрый всем вечер!
type T = A extends [infer U, 1] | [1, infer U] ? U : never;
type F = T;
У F тип 2 | 1
type T = A extends [infer U, 1] | [1, infer U, infer U] ? U : never;
type F = T;
У F тип 2 | 3, но исходя из первого примера должен быть 2 | 3 | 1
Но это почему-то не так...
Как вообще понимать такое поведение?
Вы сохраняете 2 и 3 через инфер в U. Из него получается объединение. Все правильно. А первый параметр игнорируется, потому что длина 3, а не 2.
@@wisejs Не совсем понятно, почему в первом примере тип F 2 | 1, если тогда по идее должно быть 1 | 2...
И почему в первом примере появляется 1, если кортеж [1, 2] в принципе не может расширить кортеж [infer U, 1]?
Объясните, пожалуйста, что именно прям в деталях происходит внутри компилятора TS, как он вообще обрабатывает инструкцию A extends [infer U, 1] | [1, infer U] ? U : never
?
Просто в моем понимании если у нас аргументом дженерика попал тип [1, 2], то мы должны той инструкцией проверить, расширяет ли тип [1, 2] тип [infer U, 1] | [1, infer U... Истинность того, что расширяет, вытекает из подтипа [1, infer U], поэтому мы в U записываем 2... А откуда потом берется 1 я прям реально не могу понять... ((
@@МихаилСидоров-ч7я первый пример выглядит как баг.
Оооо, бомба
ничего не понял 🙄
Надо с основ начинать. Такое не сходу поймешь.
а зачем бросил канал ???
perfect
чет жесть какая-то, можно пример, где это на практике пригодится?
В видео есть примеры. Это не часто используемый, но полезный функционал. Я, например, постоянно использую ReturnType.
Программисты на C# или Java молча наблюдают как TypeScript стреляет себе в ногу ))) С лексической стороны, подобные конструкции это - самое уродливое ООП, которое я когда-либо видел. Тот случай когда костыли становятся просто не читаемыми.
@@starwalker.musician Каким боком ООП к данным конструкциям?
@@wisejs эти конструкции проявление параметрического полиморфизма в своем самом извращенном варианте
@@starwalker.musician реально это выглядят как не особенности языка, а реально костыли, которые лучше вообще обходить стороной.
молодец, не забывает язычок трубочкой сворачивать, когда иностранные слова произносит!
По моему без infer легче
jjj
Спасибо за видео. Еле-еле разобрался
Всё что касается условных типов и infer - это какой-то кромешный 3,14здец
7:40 как вообще такое чудовище читать
Ты еще Перл не видел, вот там чудовище! Write only code.