афигеть за первые 5 минут видоса увидел столько откровений именно такой видос обьясняющий неочевидные механики я ждал возможно аюб не прочитает мой коммент под прошлым видосом поэтому продублирую здесь: "вместо того чтобы создавать функцию typedMemo, можно через ключевое слово declare перетипизировать memo из React"
Очень классное видео, только вот совсем непонятно, зачем такие сложные типы нужны) пока что не приходилось на работе с таким сталкиваться. Надеюсь, разберусь, чтобы потом вернуться еще раз к видео и понять всё
Вот да, прикольно узнавать, что так можно писать, но зачем это нужно? Когда это нужно? Хотелось бы увидеть примеры использования, потому что обычно такой необходимости нет
Ну если есть вопрос зачем - то тогда они и не нужны. Однако примеров много, зачастую они связаны с чем-то нестандартным - Маппинг токенов для темы, библиотеки, и тд.
Спасибо за видос, всё более менее понятно (не совсем только понял этот синтаксис {...}[keyof T] в теме mappedType -> union. По ходу надо просто запомнить эту конструкцию, логически я ее хоть убей не понимаю, как она строится и почему после объекта идут квадратные скобки с keyof T). Еще, подскажите, как сделать union не массивов, а объектов, причем чтобы в качестве ключей объектов в union нужно использовать существующие ключи в изначальном mappedType. То есть, сделать из type o = { a: string, b: number, c: boolean } такой union { a: string } | { b: number } | { c: boolean } Попробовал так type res = { [K in keyof T]: { K: T[K] } }[keyof T] но он воспринимает K не как переменную, а как литеральный ключ. Заранее спасибо)
Спасибо! Примеры не стал приводить, так как большинство из них сложные и специфичные под определенный кейс. Но учту в следующий раз, попробую привести что-то наглядное.
Точный ответ я не знаю, но это деталь TS, если ты пишешь Record - то это любой непримитив. А если Record то у тебя должен быть index signature - то есть возможность писать/читать в любые ключи, что соответствует только объекту.
Да все просто: Так как у нас From пустая строка и подстроку найти не удалось, то идем с самого начала. Start не может быть пустой, при условии, что исходная строка не пустая, то запись `${infer Start}{From}${infer End}` можно интерпретировать как 'f' + '' + 'oobarbar'. И дальше уже все понятно. А вот если бы была запись вида `{From}${infer End}`, то тогда бы foo встала в самое начало и было бы foofoobarbar
@@fayster91 Спасибо, понятно. Правда основано на утверждении, "Start не может быть пустой" - это самый неоднозначный момент, который, походу, можем вывести только эмпирически, если не лезть в исходники TS. Хотя может и в доках где написано, но сомнительно.
Здравствуйте, начал обращать внимание на типы в библиотеках и стал часто видеть такое interface IExamole1 { should: IFunctions; } И самое не понятно для меня это interface IFunctions { (arg1: “be.have”, type: string): any } И вызвав функцию с типом IFunctions можно параметры выбирать из arg1, а не просто передавать строку…Будьте добры, объясните как же это работает Пример из cypress взят)
Если я тебя правильно понял, то весь смысл заключается в том, что в TS есть литеральные типы. То есть не просто строка, а конкртно "a" | "b" | "c". То есть, если ты передашь туда "asf" - то это будет не правильно. Так вот, когда ты юзаешь литеральные типы, то ТС тебе будет сам подсказывать возможные варианты.
Хороший контент. Идеально подходит для тех кто хочет быстро изучить Typescript или повторить забытые вещи. Продолжай в том же духе. Желаю удачи.
Спасибо!
мощнейшее видео, лучший контент по TS на просторах рунета
афигеть за первые 5 минут видоса увидел столько откровений
именно такой видос обьясняющий неочевидные механики я ждал
возможно аюб не прочитает мой коммент под прошлым видосом поэтому продублирую здесь:
"вместо того чтобы создавать функцию typedMemo, можно через ключевое слово declare перетипизировать memo из React"
А я по-моему под прошлым ответил уже)
По поводу overwrite'а типизации - я просто не люблю так делать, но способ тоже рабочий.
как всегда отлично, продолжай!
Спасибо!
Как всегда по красоте раскидал, спасибо.
Спасибо за фидбэк!
Спасибо(Очень:нужное):видео
let рад: что = "понравилось";
Спасибо! как всегда круто
Рад, что понравилось!
Очень круто, узнал много нового. Спасибо!
не за что!
Спасибо, с каждым видео становится понятнее.
Круто, что есть прогресс!
Давай, вперёд во благо!
Спасибо!
Спасибо за познавательный контент!
не за что)
комментарий в поддержку канала
Спасибо!
Прикольное видео про задачки, спасибо!)) а можно еще?)
Спасибо за фидбэк! Да, можно попробовать еще сделать.
Продвигаем
Спасибо!
👏👍
Спасибо!
Очень классное видео, только вот совсем непонятно, зачем такие сложные типы нужны) пока что не приходилось на работе с таким сталкиваться. Надеюсь, разберусь, чтобы потом вернуться еще раз к видео и понять всё
Вот да, прикольно узнавать, что так можно писать, но зачем это нужно? Когда это нужно? Хотелось бы увидеть примеры использования, потому что обычно такой необходимости нет
Ну если есть вопрос зачем - то тогда они и не нужны. Однако примеров много, зачастую они связаны с чем-то нестандартным - Маппинг токенов для темы, библиотеки, и тд.
❤🎉
Лучший контент по TS на русском языке❤🔥❤🔥❤🔥
Соглашусь!
Спасибо большое!
да, 100%
Центральный Typescript учебник!
До учебника думаю тут далеко, больше курс по повышению квалификации)
Спасибо за видос, всё более менее понятно (не совсем только понял этот синтаксис {...}[keyof T] в теме mappedType -> union. По ходу надо просто запомнить эту конструкцию, логически я ее хоть убей не понимаю, как она строится и почему после объекта идут квадратные скобки с keyof T).
Еще, подскажите, как сделать union не массивов, а объектов, причем чтобы в качестве ключей объектов в union нужно использовать существующие ключи в изначальном mappedType. То есть, сделать из
type o = {
a: string,
b: number,
c: boolean
}
такой union
{ a: string } | { b: number } | { c: boolean }
Попробовал так
type res = {
[K in keyof T]: { K: T[K] }
}[keyof T]
но он воспринимает K не как переменную, а как литеральный ключ. Заранее спасибо)
Goood!
Thanks!
го видос по диклорациям в ts. Важная тема
У меня есть в списке, правда кажется, что людям поднадоел чуть плейлист этот. Постараюсь выпустить в ближайшее время.
Хорошее видео, но не хватает примеров из реальных задач со сложной типизацией
Спасибо! Примеры не стал приводить, так как большинство из них сложные и специфичные под определенный кейс. Но учту в следующий раз, попробую привести что-то наглядное.
Как сделать чтобы // ^? работал
А почему если использовать в DeepReadonly тип Record, а не Record то он не пропускает кейс с функциями?
Точный ответ я не знаю, но это деталь TS, если ты пишешь Record - то это любой непримитив.
А если Record то у тебя должен быть index signature - то есть возможность писать/читать в любые ключи, что соответствует только объекту.
Интересно было бы узнать, почему так забавно в "ffoooobarbar" расколбасило в граничном кейсе на 29:24.
Да все просто:
Так как у нас From пустая строка и подстроку найти не удалось, то идем с самого начала. Start не может быть пустой, при условии, что исходная строка не пустая, то запись `${infer Start}{From}${infer End}` можно интерпретировать как 'f' + '' + 'oobarbar'. И дальше уже все понятно. А вот если бы была запись вида `{From}${infer End}`, то тогда бы foo встала в самое начало и было бы foofoobarbar
@@fayster91 Спасибо, понятно. Правда основано на утверждении, "Start не может быть пустой" - это самый неоднозначный момент, который, походу, можем вывести только эмпирически, если не лезть в исходники TS. Хотя может и в доках где написано, но сомнительно.
Мне кажется тут есть какой-то странный механизм того, как TS матчит эти строки. Детально я прямо не скажу, почему так).
Здравствуйте, начал обращать внимание на типы в библиотеках и стал часто видеть такое
interface IExamole1 {
should: IFunctions;
}
И самое не понятно для меня это interface IFunctions {
(arg1: “be.have”, type: string): any
}
И вызвав функцию с типом IFunctions можно параметры выбирать из arg1, а не просто передавать строку…Будьте добры, объясните как же это работает
Пример из cypress взят)
Если я тебя правильно понял, то весь смысл заключается в том, что в TS есть литеральные типы. То есть не просто строка, а конкртно "a" | "b" | "c". То есть, если ты передашь туда "asf" - то это будет не правильно.
Так вот, когда ты юзаешь литеральные типы, то ТС тебе будет сам подсказывать возможные варианты.
Вроде всё и понятно, но не понятно где это применять в реальных проектах, не хватает примеров для таких людей как я. )
Такие вещи нельзя так быстро преподносить, типичная ошибка блогеров передающих сложную информацию. Лучше медленней и с примерами. А контент отличный!
Классно, но очень быстро
Постараюсь по медленнее в следующий раз.
Про infer все равно непонятно
Я бы посоветовал потыкать самому на примерах, тогда должно дойти.