01. TypeScript / Generic and Conditional Type / as const / infer

Поделиться
HTML-код
  • Опубликовано: 28 июл 2024
  • it-incubator.io/education/?ut... - человекоориентированное, честное и профессиональное обучение front-end и back-end разработке гарантированно до трудоустройства за фиксированную стоимость.
    TypeScript сложен, а Generic Conditional Type с infer внутри со старта вырывает мозг. Мне вырвал))
    Друзья, TypeScript прекрасен. На мой взгляд очень нереально создать большой проект качественно и быстро без TypeScript.
    Я сам буду разбираться в сложном TypeScript для того, чтобы вндерять его в продакшен максимально глубоко, и буду рассказывать об этом вам, делясь опытом.
    У меня возникла боль: я не хочу в React+Redux для каждого action создавать отдельно type, мало того, я не хочу вручную объединять все эти типы для того, чтобы типизировать итоговый action, который может прилететь в reducer. С этим поможет нам Generic Conditional Type с infer внутри ;)
    Статья, о которой речь идёт в видео:
    habr.com/ru/company/alfa/blog...
    Документация:
    www.typescriptlang.org/docs/h...
    #infer #typescript #generic #conditional #react #actions

Комментарии • 169

  • @ITKAMASUTRA
    @ITKAMASUTRA  4 года назад +28

    Кстати, в конце немного не заметил ошибку, пытаясь зарефаторить вложенность.
    Итоговый результат:
    type PropertiesType = T extends {[key: string]: infer U} ? U : never;
    type GetActionsTypes any}> = ReturnType
    То есть в типе GetActionsTypes нужно указать ограничение\constraint для передаваемого T, указав, что это ОБЯЗАТЕЛЬНО должен быть объект, у которого в качестве значения св-ва обязательно функция, принимающая что-нибудь и возвращаемая что-нибудь

    • @hostiseeyou
      @hostiseeyou 4 года назад

      почему-то не работает автокомплит в компоненте , если ввожу live, то не ругается, но и не предлагает его (если ввести live232, то вывалит ошибку - тут все ок). Я решал эту задачу иначе export enum AlertStatusEnum {
      live = 'live',
      draft = 'draft',
      }
      export const ALERT_STATUS_TYPES = {
      'state:alert:live': AlertStatusEnum.live,
      'state:alert:draft': AlertStatusEnum.draft,
      }; type StatusType = keyof typeof AlertStatusEnum; Тогда в компоненте работает этот автокомплит - не понимаю почему в Вашем варианте не работает, ведь возвращается абсолютно один и тот же тип (если навести мышкой на status для сравнения что TS возвращает в Вашем и моем варианте)

    • @hostiseeyou
      @hostiseeyou 4 года назад

      моя задача похожа на ту что Вы сначала хотели показать на 29:30, но потом усложнили до объектов

    • @alexsusha4303
      @alexsusha4303 4 года назад +2

      Может быть можно еще сократить запись до следующего кода:
      type ActionReturnType = T extends {[key: string]: (...args: any[]) => infer R} ? R : never;
      type ActionType = ActionReturnType
      И в reducer определять просто action : ActionType.
      Хотелось бы узнать, будет ли правильным данный метод?
      P.s. у меня все отлично работает с ним.
      P.s. спасибо за видео-урок :)

  • @MernBNS
    @MernBNS 2 года назад +12

    Димыч, уже почти год, как работаю разрабом после твоего онлайн-курса, и до сих пор продолжаю смотреть и учить новую инфу в удобном формате для себя. Спасибо тебе за твой заряд, которого нет у других ^_^

  • @aeron_rus
    @aeron_rus 27 дней назад

    Лучший канал о веб-разработке!

  • @akionka
    @akionka 4 года назад +39

    10:56 Спасибо, всегда хотел сократить себе жизнь 👍

    • @MrSvent0vit
      @MrSvent0vit 4 года назад +3

      Хей, осторожнее с такими формулировками ))

    • @Nick-hq8of
      @Nick-hq8of 3 года назад

      Кому сократили, а кому улучшили))

  • @lededit9761
    @lededit9761 4 года назад +3

    Димыч, спасибо что расписываешь по порядку от простого к сложному

  • @user-gv3le1rb5k
    @user-gv3le1rb5k 4 года назад

    Очень интересный и полезный материал. Спасибо, Димыч, за подробное объяснение!) TypeScript, Infer, типизация actions

  • @goshana1987
    @goshana1987 3 года назад +2

    Крутая тема. Полез по твоему совету в документацию поглубже. Очень кстати оказалось для большого количества actions и типов к ним. Сильно сократил код. Спасибо тебе.

  • @disposables72
    @disposables72 3 года назад

    Лучшее видео по TS, из всех что я видел! TypeScript, Generic, infer

  • @redcrown5789
    @redcrown5789 3 года назад +1

    Дичайше полезное видео и интересное. Первый раз смотрел когда только только начал знакомство с TS и про infer вообще ничего не понял, сейчас пересмотрел, озарило но обязательно нужна практика=)) Спасибо Димыч, ты как всегда космос))

  • @alexandrmerser8443
    @alexandrmerser8443 4 года назад +3

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

  • @andrewsam224
    @andrewsam224 Год назад

    Подход от простого к сложному очень крут. Именно у тебя.

  • @igorieromenko1109
    @igorieromenko1109 4 года назад

    TypeScript / Generic and Conditional Type / as const / infer. Спасибо! Всё подробно и понятно, как обычно :)

  • @user-iz9dz2gh9j
    @user-iz9dz2gh9j 3 года назад

    Спасибо большое Димыч! Очень сильно помогаешь с освоением React / typescript

  • @legendarysergeygaming6395
    @legendarysergeygaming6395 4 года назад +2

    Ну что я хочу сказать то :)
    Посмотрел все до конца и пошел переделывать свои Action Creators.
    Круто разложен весь материал по полочкам, не знал что typescript штука такая мощная.
    Хотя я примерно видел подобное но для меня оставалась загадкой все равно как, зачем и почему.
    Вообщем спасибо за материал, буду погружаться полностью в TypeScript.
    Замотивирован на полную.

  • @user-ho9iw9si9u
    @user-ho9iw9si9u 3 года назад

    Димыч на высоте как всегда! Спасибо. Generic and Conditional Type / as const / infer

  • @user-ug1vi3bv1f
    @user-ug1vi3bv1f 2 года назад +1

    Ну ты крутой, Димыч! Жму руку за твой труд, очень сильно помог, благодарю!

  • @ivankomar4227
    @ivankomar4227 4 года назад

    Димыч, спасибо за то, что потратил на этой время)
    реально решил мою боль с Actions

  • @dmitrii_gerasimov
    @dmitrii_gerasimov 2 года назад +2

    Классно объяснил Generic. Посмотрел несколько видео других авторов, но не нашёл такого понятного объяснения.

  • @alexwake927
    @alexwake927 2 года назад

    Спасибо за видео, как всегда все понятно рассказано, боялся generic, не мог понять, спасибо, что все разжевал!

  • @SemenAlexndrovich
    @SemenAlexndrovich 3 года назад

    Спасибо! Ваши уроки бесценны =)

  • @dmag3287
    @dmag3287 2 года назад

    Димыч, на мой взгляд твое видео одно из лучших по TS, Generic, as const, infer

  • @dmytroNaholiuk
    @dmytroNaholiuk 3 года назад +1

    Спасибо!!!!Даже мой кот сидел рядом со мной и смотрел с интересом)
    TypeScript / Generic and Conditional Type / as const / infer
    Летим в космос!!!

  • @anastasiiamineeva4315
    @anastasiiamineeva4315 3 года назад

    Как всегда офигенно! Спасибо огромное!

  • @user-pc9bl7uf1l
    @user-pc9bl7uf1l 3 года назад

    Все как всегда на высоте! Благодарю!

  • @4wesome_maks30
    @4wesome_maks30 4 года назад

    Офигенный видос,как раз ненравилось то,что постоянно дублирую коду при типизации экшенов.Спасибо!

  • @maxkos6184
    @maxkos6184 4 года назад

    Самый интересный канал на youtube. Все же я задрот программист наверное. Тема улет. Всегда хотел попробовать ТайпСкрипт ). Спасибо за видос

  • @mrmicolka
    @mrmicolka 4 года назад +2

    Статья была предложена в 6 видео React + Redux + TypeScript, типизация Actions и Thunk. Димыч тогда обещал сделать как в ней. Я ее прочитал и, кроме идеи, нифига не понял. А тут видео с разбором подоспело.
    Димыч сказал - Димыч сделал! Спасибо)

  • @alekseyberezov8020
    @alekseyberezov8020 3 года назад

    Очень крутая тема generic + infer. Например в Redux можно типизировать любое кол-во actios просто на изи. Спасибо Димыч, что разжевал статью Дмитрия Новикова!

  • @Erebor99700
    @Erebor99700 2 года назад

    Так вот где видос , который внесет ясность , смотрю 2 сезон пути самурая и примерно с 9-10 выпуска перестал понимать , что происходит , а оказывается есть такой видос . Спасибо за труд , бомбим дальше )

  • @izzei-1614
    @izzei-1614 4 года назад

    Насколько же это крутое видео, я не могу удержаться от восторга)))
    01. TypeScript / Generic and Conditional Type / as const / infer
    IT-KAMASUTRA
    IT-TYPESCRIPT
    #infer
    #typescript
    #generic

  • @habalgarmin
    @habalgarmin Год назад

    наконец-то понял для чего нужен этот infer. Спасибо, Димыч!

  • @user-pz7eq2ed9f
    @user-pz7eq2ed9f 2 года назад

    то чувство когда хочешь поставить лайк в конце видоса, а оказывается уже поставил. Качественный контент!

  • @mykhailostepanishchev6472
    @mykhailostepanishchev6472 3 года назад

    Димыч самый круто чел ! спасибо ! TypeScript / Generic and Conditional Type / as const / infer

  • @zascia100
    @zascia100 2 года назад +1

    С первого раза въехать очень сложно, но действительно магия!

  • @vb5059
    @vb5059 4 года назад +1

    Спасибо автору!
    Хороший материал!

  • @madden3307
    @madden3307 4 года назад

    Здорово! Все понятно и мне пригодилось в своем проекте!

  • @MJstart
    @MJstart Год назад

    Спасибо Димыч. Сложная тема, но ты объяснил отлично

  • @user-je1el3gj9d
    @user-je1el3gj9d 4 года назад +4

    Я очень ждал видео от тебя)

  • @sergioostanioni5390
    @sergioostanioni5390 3 года назад +2

    Димыч, привет. Выскажу пару соображений: 1. Шрифт можно и нужно делать крупнее. Первые 15 минут средний вертикальный фрейм экрана пустой. 2. Вложенность типов глубиной более двух уровней усложняет, особенно, когда типизация автоматическая: брат тещи его кума - согласись не просто воспринимается.

  • @user-zs7kr6yp2s
    @user-zs7kr6yp2s 3 года назад

    ну ты даешь конечно) раскидал все по полочкам, будь здоров брат !

  • @lededit9761
    @lededit9761 4 года назад +14

    Есть пожелание: оставляй в конце видео чистый отрефакторинный код - так визуально приятно анализировать результат, а так же проще воспроизвести

  • @alekseyisaev6305
    @alekseyisaev6305 3 года назад +1

    огонь! приятненько получать разжеванную инфу)) разбери тему типизирования композиции компонентов в react, плз

  • @sandorkligan2208
    @sandorkligan2208 5 месяцев назад

    Спасибо, Димыч! Благодаря тебе разобрался

  • @1want2be3
    @1want2be3 3 года назад

    Вообще бомба просто, на одном дыхании

  • @xmarsianca
    @xmarsianca 2 года назад

    Вчера сама эту же статью нашла,несколько раз прочитала.а сегодня это видео все на свои места всталр

  • @karway211
    @karway211 3 года назад

    Круто! Спасибо! TypeScript / Generic and Conditional Type / as const / infer

  • @danilblack8296
    @danilblack8296 4 года назад

    TypeScript, Generic, infer, type, Conditional Type.
    Dimych is the best teacher of the world!

  • @user-fx8th7nu8e
    @user-fx8th7nu8e 2 года назад

    Классный видос) TypeScript, Generic

  • @RRJxRaiZoR
    @RRJxRaiZoR 4 года назад +11

    Димыч, контент годный. Будь здоров и бомби, бомби, бомби! С меня очередной лойс.
    По поводу Nullable. В typescript (в версии 2.8) в числе прочих типов был введён тип NonNullable.

    • @margokomilfo4428
      @margokomilfo4428 3 года назад +1

      NonNullable- это, я понимаю, наоборот - тип, который говорит, что не может быть null.

    • @user-iz9dz2gh9j
      @user-iz9dz2gh9j 3 года назад

      NonNullable не подходит. webstorm не дает никакой подсказки по этому типу/утилите

  • @user-fr2fd4vj4p
    @user-fr2fd4vj4p Год назад

    Спасибо за отличное объсниние TypeScript.

  • @goshana1987
    @goshana1987 3 года назад

    Спасибо, как всегда очень помогли.

  • @hasannamazl7584
    @hasannamazl7584 4 года назад

    Очень полезно! Спасибо огромное

  • @Akunov-oy9mx
    @Akunov-oy9mx 2 года назад

    Спасибо! Всё подробно и понятно

  • @2212MG
    @2212MG 3 года назад

    Круто, не знал про эти фишки

  • @oconnor4417
    @oconnor4417 Год назад

    Димыч ты просто лучший! Добей пожалуйста путь самурая 2.0 !!!❤❤❤

  • @andrewsam224
    @andrewsam224 Год назад +1

    Димыч, очень полезно и спасибо. Может ещё пару видео про фишки с ТS. Будем ждать.

  • @margokomilfo4428
    @margokomilfo4428 3 года назад +3

    последние минут 7 просто взорвали мозг...=)

  • @vd7533
    @vd7533 2 года назад

    10:56 "Мы сократили и улучшили себе жизнь") эт точно)) Сложная долгая жизнь разраба - это мука)

  • @dmitriystoyanov933
    @dmitriystoyanov933 2 года назад

    Работаю на тайпскрипте 4 месяца, но еще довольно-таки нубас) Этот видос добавил понимания, спасибо!

  • @4viewsde681
    @4viewsde681 4 года назад +1

    Super Content!

  • @kondakov90
    @kondakov90 4 года назад +3

    Забавно, что пару дней назад я тоже эту статью читал ))

  • @vvvkar8449
    @vvvkar8449 4 года назад

    Dimich ti krasavchik👍👍👍

  • @user-il4ph3fr6h
    @user-il4ph3fr6h 3 года назад

    спасибо за урок, недавно протипизировал все редюсоры на проекте будучи на 5том уроке второго сезона... Поторопился))) Но руку набил, удачи

  • @user-yj8qc5so2c
    @user-yj8qc5so2c 2 года назад

    Супер! Спасибо!

  • @evgeniysurma8116
    @evgeniysurma8116 4 года назад

    класс, как раз пришел к этому видео пытаясь разобрать эту статью на хабре

  • @RainbowJet1
    @RainbowJet1 2 года назад

    Очень сложно но очень интересно, спасибо !)

  • @el_marca4987
    @el_marca4987 2 года назад

    Димыч, ты все таки очень мегакрут. Никто даже платно так не объясняет, как это делаешь ты.

  • @nullf192
    @nullf192 2 года назад

    Димыч, лучший !

  • @js_talks
    @js_talks 4 года назад

    Спасибо большое! Я думаю infer и extend можно было бы использовать для исключения некоторых свойств в зависимости от других.
    Столкнулся с такой задачей, в зависимости от варианта TextField могут быть доступны или не доступны какие-то пропсы у этого компонента.
    а вот variant="label_inside_input" может иметь только size="big".
    Это как перегрузка конструкторов в C# или Java.

  • @anthony_fed
    @anthony_fed 2 года назад

    Димыч, Магаспасибо!

  • @user-ux5bp3dg5z
    @user-ux5bp3dg5z 4 года назад

    Ууууу, летим!!!!))

  • @nikolaykasparov8387
    @nikolaykasparov8387 4 года назад +7

    Заслуженный лойс. В ру сегменте по ts одна шляпа, а это вроде годно.

    • @domin1c
      @domin1c 4 года назад +2

      Не только в ру. На английском тоже в основном хрень типа "ну вот у нас тут будет строка. Глядите как круто-теперь подсказка есть ололо".

    • @squabble3332
      @squabble3332 3 года назад +2

      @@domin1c есть такой чувак, Ben Awad, у него довольно годно все по реакту и иже с ним. Сори за рекламу

  • @user-wf8bu6mt2i
    @user-wf8bu6mt2i 3 года назад

    Top video!

  • @v_korol
    @v_korol 2 года назад

    Круто!! #React #Typescript #Generic #asConst

  • @user-jc6xv3oy7b
    @user-jc6xv3oy7b 4 года назад +4

    Воу, только захотел углубиться в TS, а тут целая серия роликов стартовала.

    • @powerpuff_luv
      @powerpuff_luv 3 года назад

      Недолго продлилась правда, ахахах

  • @sdd5132
    @sdd5132 4 года назад

    ТЫ КРУТОЙ !!

  • @user-vm3ui3rc8u
    @user-vm3ui3rc8u 2 месяца назад

    спасибо бро что не в реакте, а в тайпскрипте)

  • @uaplatformacomua
    @uaplatformacomua 2 года назад +1

    В самых первых примерах кода типа type UserType - Type избыточно, достаточно просто type User

  • @user-gi3sh6ul2j
    @user-gi3sh6ul2j 3 года назад +2

    Спасибо, было полезно). А только две части из этого цикла или продолжение есть?)

  • @originalhrysha1976
    @originalhrysha1976 4 года назад

    КОНИЧУА! СПС самурай!

  • @mediontamginskii5889
    @mediontamginskii5889 2 года назад

    Ну за такое не грех подписатся!!!)))

  • @alexbork8659
    @alexbork8659 2 года назад

    Супер ......... !!!!!!!!

  • @ValarM1
    @ValarM1 3 года назад

    Суперполезно

  • @PerryCoxer
    @PerryCoxer 2 года назад

    Лучше много кода очевидного, чем мало неочевидного.

  • @genesismens9898
    @genesismens9898 3 года назад

    Теперь всё понятно

  • @kirillpavlovskii8342
    @kirillpavlovskii8342 2 года назад

    очень помогло спасибо

  • @voyvb
    @voyvb 2 года назад

    Димыч лучший

  • @apodkovyrov
    @apodkovyrov 4 года назад +1

    Еще можно клёво извлекать типы из массива строк.
    const userNames = ['Dymuch', Valera', 'Vitor'] as const
    type ArrayValues = T extends ReadonlyArray ? V : never;
    type UserNames = ArrayValues
    Мне пригождалось пару раз

  • @araikrasoyan702
    @araikrasoyan702 2 года назад

    Спасибо

  • @Vllad_Ko
    @Vllad_Ko 4 года назад

    Ух, не простая тема! Димыч молодец объяснил хорошо.
    Такой вопрос возник, generic это такое подобие настраиваемой динамической типизиции, или infer, или оба?

  • @asmodeus7862
    @asmodeus7862 3 месяца назад

    спасибо скоро оффер ;)

  • @user-nw5br5jg9k
    @user-nw5br5jg9k 2 года назад

    Огонь

  • @mr.rodrigo979
    @mr.rodrigo979 2 года назад

    31:06 - Это я на собесе ))
    К слову, можно и так написать:
    type SomeType= typeof obj[keyof typeof obj];

  • @user-lq5fs9eb8v
    @user-lq5fs9eb8v 4 года назад

    Там ксати в той статье по ссылке, в одном из комментариев есть ссылка на библиотеку Unionize. Не пробовал еще, бегло глянул. выглядит интересно для объединения экшенов

  • @sashahoncharenko1730
    @sashahoncharenko1730 3 года назад

    Поддержка от меня в твою копилку )

  • @whicencer8819
    @whicencer8819 3 года назад

    5:11 Уже сам мозг намикает, что нужно больше видео по реакту)))

  • @Vlad-us9xt
    @Vlad-us9xt 3 года назад

    top)

  • @gaben-agent
    @gaben-agent 3 года назад

    Удачи ребят)
    19:19

  • @user-rd7gk6xc8i
    @user-rd7gk6xc8i Год назад +1

    Всем привет! подскажите, можно ли было обойти создание дополнительного типа Nullable при создании типа initial на 10:27? Можно ли было воспользоваться типизацией через unknown? Есть ли у этих подходов существенные отличия?
    photo: null as unknown as PhotoType,
    user: null as unknown as UserType,

  • @AndranikArshakyan
    @AndranikArshakyan 2 года назад

    полезно