Продвинутое использование дженериков в TypeScript

แชร์
ฝัง
  • เผยแพร่เมื่อ 30 ก.ย. 2024

ความคิดเห็น • 92

  • @atlantatesla9348
    @atlantatesla9348 3 หลายเดือนก่อน +2

    У тебя отличный контент, спасибо!
    Но, кажется, чтобы понять in/out, стоило рассказать про вариантность.
    in/out явно указывают вариантность.
    Вариантность это один из механизмов с помощью которого компилятор понимает совместимы типы или нет.
    Всего 4 вида вариантности.
    Нас интересуют сейчас 2 из них.
    1) ковариантность - если ожидаем родительский класс, то можно присвоить и класс потомок
    2) контравариантность - если ожидаем родительский класс, то нельзя присвоить класс потомок.
    Но можно присвоить класс, который предок родительского
    Даны классы
    class Animal {
    public name = '';
    }
    class Bird extends Animal {
    public fly() {}
    }
    class Crow extends Bird {
    public caw() {}
    }
    const somebody1: Animal = new Animal(); // можно присвоить также new Bird() и new Crow()
    const somebody2: Bird = new Bird(); // можно присвоить также new Crow()
    const somebody3: Crow = new Crow(); // сюда больше ничего нельзя присвоить кроме Crow
    Это примеры ковариантности. В ts везде кроме параметров функций используется ковариантность.
    В параметрах функций контравариантность.
    Пример контравариантности:
    type F = (s: Bird) => boolean
    const someFunction1: F = (s: Animal) => true // ok
    const someFunction2: F = (s: Bird) => true // ok
    const someFunction3: F = (s: Crow) => true // ERROR! Типы не совместимы
    На первый взгляд это может показаться странным.
    Но пример ниже все поясняет.
    const array = [new Bird(), new Bird(), new Bird()];
    const filter = (predicate: F) => {
    return array.filter(predicate);
    };
    const someFunction4 = (s: Crow) => {
    s.caw(); // но ведь в последней строке мы планируем проитерироваться по Bird(), у которых нет метода caw()
    };
    filter(someFunction4); // Error
    Возвращаясь к in/out
    Getter ковариантен относительно T, поэтому out модификатор.
    Setter контравариантен относительно T, поэтому in модификатор.

    • @ayub_begimkulov
      @ayub_begimkulov  2 หลายเดือนก่อน +1

      Спасибо за дополнение!

  • @atlantatesla9348
    @atlantatesla9348 3 หลายเดือนก่อน +1

    Если кого-то заинтересует подробнее почему примеры из in/out совместимы, могу посоветовать прочитать про совместимость типов на основе вариантности (Ковариантность, Контрвариантность)

  • @ЛеонидИванов-й3ь
    @ЛеонидИванов-й3ь 3 หลายเดือนก่อน +1

    Спасибо, очень сжатый и полноценный сгусток информации

  • @АнатолийГорбов-о1ь
    @АнатолийГорбов-о1ь ปีที่แล้ว +6

    Супер! Лучшее видео по разбору дженериков, больше половины из ролика вообще нигде на других каналах не видел, Спасибо!

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      рад, что понравилось!

  • @АлександрКалинин-ъ6й
    @АлександрКалинин-ъ6й ปีที่แล้ว +11

    Интересный момент про запятую в JSX, не знал этого. Спасибо👍

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว +1

      Я даже не думал, что кто-то уделит отдельное внимание этому. Спасибо за фидбэк!

    • @_GyG_
      @_GyG_ ปีที่แล้ว +2

      @@ayub_begimkulov я тоже долго мучался с этим, но стак оверфлоу наше всё)

    • @aipronator
      @aipronator ปีที่แล้ว

      Этот момент не раз отталкивал исползовать дженерики в компонентах Реакт)

    • @АнатолийГорбов-о1ь
      @АнатолийГорбов-о1ь ปีที่แล้ว

      реально это была проблема))) спасибо за такой маленький, но очень важный нюанс)

  • @ЭзизК
    @ЭзизК ปีที่แล้ว +6

    можно помедленнее ?)

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว +4

      Спасибо за фидбэк! Постараюсь в следующий раз не торопиться так сильно, а пока можно поставить 0.75 скорость)

    • @_GyG_
      @_GyG_ ปีที่แล้ว +2

      @@ayub_begimkulov посади медленно говорящего джуна, пусть переозвучивает, заодно и сам разберется, пока вникает во всё это))

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว +1

      @@_GyG_ Мне кажется так сложнее будет, так как он может упустить моменты) Да и в целом самому надо софт скиллы качать.

  • @_GyG_
    @_GyG_ ปีที่แล้ว +3

    Привет! Спасибо за полезную инфу! Можно чуть медленнее и более "разжевывать" для чайников?) Я бы лучше два получасовых ролика посмотрел, чем один в твоей скорости х1.5))

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว +3

      Привет. Хорошо, постараюсь, в следующем видео улучшить эти моменты. Спасибо за обратную связь!

  • @DenisB-d5f
    @DenisB-d5f ปีที่แล้ว +1

    Ставь бейз если понял про in/out
    Ставь specific, если не понял ничего

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      Вроде в комментах количество specific не показывается)

  • @romanryaboshtan9270
    @romanryaboshtan9270 11 หลายเดือนก่อน +1

    Аналога этого видео больше нет на просторах рунета, подробнейшее объяснение, раньше ничего подобного вообще не видел!!!

  • @givgiv6688
    @givgiv6688 ปีที่แล้ว +2

    У тебя лучшие видео про ts, удачи твоему каналу 😊

  • @andreylobanov4983
    @andreylobanov4983 ปีที่แล้ว +2

    очень круто объяснил про in out

  • @Artem-u5e9c
    @Artem-u5e9c 11 หลายเดือนก่อน

    13:40 автор похоже просто скопировал выведенный тип из нативной filter? 😁 Там достаточно и такого объявления дабы не перегружать синтаксис:
    function myfilter(
    arr: Item[],
    predicate: (value: Item) => value is FilteredItem
    ) {
    return arr.filter(predicate)
    }
    Тем не менее благодарю - почерпнул из видео полезного для себя! Не знал про такую особенность применения тайпгардов!

  • @chistyakofff
    @chistyakofff ปีที่แล้ว

    Привет! Можешь подсказать по примеру на 13:51, не понятны 2 момента. 1-ый: почему параметры функции predicate: index, originalArray здесь описаны и они обязательные, хотя в isNumber мы принимаем только value и в build-in функции filter эти параметры необязательные . И 2-ой вопрос: в чём конкретное различие FilteredItem и Item, ведь в конечном итоге FilteredItem просто расширяет Item и они оба имеют один тип. PS: спасибо за контент!

  • @narek1771
    @narek1771 ปีที่แล้ว +3

    Спасибо за труд с помщю твоих видео я стал лучше понимать typescript хорошо обясняешь еще и примеры очень разясняют

  • @romanryaboshtan9270
    @romanryaboshtan9270 11 หลายเดือนก่อน

    hi, можешь помочь с типом??? Я на проекте понаписывал кучу разных типов, но с одним кое-что не получается, но так объяснить не могу, нужно показывать код...

  • @AibekM-x7v
    @AibekM-x7v ปีที่แล้ว

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

  • @jgkdmdevienjjgg8866
    @jgkdmdevienjjgg8866 ปีที่แล้ว +2

    in out из C# стащили. Там это юзалось для generic интерфейсов, тесно связано с covariance/contravariance/invariance. В ts вывод типов поумнее, по этому как-то оно сходу и не нужно было, но видимо добавили для специфичных случаев когда оно само разрулить не может. Мутная тема конечно, плохо запоминается

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      Кто-то тут еще говорил, что in out из sql взяли. Так вообще согласен, что плохо запоминается по началу.

  • @drevitsky
    @drevitsky ปีที่แล้ว

    Сильно тарахтишь, говори членораздельно.

  • @just__did__it
    @just__did__it ปีที่แล้ว +1

    У тебя своя студия? Когда следующий трек?

  • @anton7p704
    @anton7p704 ปีที่แล้ว +2

    крутой контент

  • @rustam_gasymov
    @rustam_gasymov ปีที่แล้ว +1

    Слушай, как у тебя vscode тип подсвечивает? Это расширение или ты на видео накладываешь?? Спасибо

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      marketplace.visualstudio.com/items?itemName=Orta.vscode-twoslash-queries

  • @Sengulair
    @Sengulair ปีที่แล้ว +1

    3:30 С версии Typescript 5.0 можно использовать const прямо в дженерике объявления функции

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      Да, это классная фича. Спасибо, что поделился!

  • @web__dev
    @web__dev ปีที่แล้ว

    Спасибо за видео, только вот новый синтаксис вообще запутанно как-то, с этими бейсами, спицификами))

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว +1

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

  • @johnenglish5898
    @johnenglish5898 ปีที่แล้ว

    ты откуда ?

  • @kirillboychenko7724
    @kirillboychenko7724 ปีที่แล้ว +1

    спасибо большое аюб за твои видосы!

  • @artemivanov5013
    @artemivanov5013 ปีที่แล้ว +1

    Скажите пожалуйста в чем разница между:
    (value:T) => и
    (value: string) =>
    если знаем что тип стринг, зачем дженерик?

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      Вот наглядный пример:
      tsplay.dev/mxjQzw

    • @artemivanov5013
      @artemivanov5013 ปีที่แล้ว

      @@ayub_begimkulov Спасибо!

  • @kirillpodolinniy309
    @kirillpodolinniy309 ปีที่แล้ว +1

    Аюб, спасибо за видео) Что у тебя за наушники?

  • @romanryaboshtan9270
    @romanryaboshtan9270 11 หลายเดือนก่อน

    Канал тотальной годноты, по своей ценности очень похож на ulbi tv, уровень экспертности автора поражает, да, здесь есть чему поучиться middle разрабам!!!

  • @WebEnv
    @WebEnv ปีที่แล้ว +1

    Супер❤ Давай про infer тогда ещё!

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      Спасибо! infer есть в планах.

  • @vladosk-lv6kp
    @vladosk-lv6kp ปีที่แล้ว +1

    Отличный контент, спасибо тебе! Больше видео по тс)

  • @gazdhikhartumov1159
    @gazdhikhartumov1159 ปีที่แล้ว +1

    лучшее видео про объяснение дженериков )

  • @shadowplay1211
    @shadowplay1211 11 หลายเดือนก่อน

    лучший разбор дженериков на всём ютубе, спасибо тебе, очень много нового узнал)

  • @johnd1431
    @johnd1431 ปีที่แล้ว +1

    Довольно информативно получилось

  • @mercury_2379
    @mercury_2379 ปีที่แล้ว +1

    комментарий в поддержку канала

  • @fedordostoevskiy4209
    @fedordostoevskiy4209 ปีที่แล้ว +1

    👀👀👀, мощный ролик. 👍👍👍

  • @rizemun
    @rizemun ปีที่แล้ว

    Спасибо за хороший контент

  • @igor_ni
    @igor_ni ปีที่แล้ว

    Мозги кипят! 😀

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว +1

      Болит - значит растет)

  • @raijinhasarrived
    @raijinhasarrived ปีที่แล้ว +1

    Рахмэт

  • @dfkadyr
    @dfkadyr ปีที่แล้ว +1

    Спасибо

  • @malsagov6331
    @malsagov6331 ปีที่แล้ว +1

    Контент огонь! 🔥

  • @raijinhasarrived
    @raijinhasarrived ปีที่แล้ว +1

    14:30 кайфово

  • @alexanderkomanov4151
    @alexanderkomanov4151 ปีที่แล้ว +1

    Спасибо!

  • @mikeempire
    @mikeempire ปีที่แล้ว

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

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว +1

      Ок, постараюсь исправить в следующем видео. Спасибо за фидбэк!

  • @kostya3312
    @kostya3312 ปีที่แล้ว +1

    типЫ - это на районе которые?

    • @mikeempire
      @mikeempire ปีที่แล้ว

      Да

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      Постараюсь в след видосах больше обратить на это внимание. Спасибо за фидбэк!

  • @LevShuroff
    @LevShuroff ปีที่แล้ว +3

    Топовый канал, уверен, что он будет рости. Автору большой респект

  • @borisfred7192
    @borisfred7192 ปีที่แล้ว

    Давай уже курс свой создавай)

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      Думаю запущу как-нибудь, пока только коучингом/консалтингом/менторингом занимаюсь.
      А на какую тему хотел бы увидеть курс?

  • @amangeldi3424
    @amangeldi3424 ปีที่แล้ว

    Чел просто шарит за то что говорит

  • @ferdinandkontr1451
    @ferdinandkontr1451 ปีที่แล้ว

    друг а ты можешь запилить гайды по каждому разделу handbook тс доки?

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      Доку пересказывать, к сожалению, не вижу смысла) Покрываю только те темы, которые считаю реально полезными и нужными. Но думаю в плейлисте большую часть тем разберем так или иначе.

  • @人天-i5s
    @人天-i5s ปีที่แล้ว +1

    Как я помню in, out есть в PL/SQL. Очень полезное видео, спасибо😃👍🏼

    • @ayub_begimkulov
      @ayub_begimkulov  ปีที่แล้ว

      Прикольно, даже не знал об этом.