TypeScript. Для чего нужен type guard?

  Рет қаралды 7,698

Frontend не для всех

Frontend не для всех

Күн бұрын

Пікірлер: 55
@vzlomer1000
@vzlomer1000 2 жыл бұрын
СПАСИБО, это было действительно понятное обьяснение, продолжайте снимать видосы, это вообще очень почетно что женщина еще и програмист !
@Kulibins1
@Kulibins1 3 жыл бұрын
Ура. Бегом смотреть 👍
@vsevolodpetrolhead8689
@vsevolodpetrolhead8689 2 жыл бұрын
Было очень полезно, давай еще видео в таком же формате!
@Doktornikita
@Doktornikita 3 жыл бұрын
Конечно делать!
@denisttk
@denisttk 2 жыл бұрын
Очень доходчиво излагаете про TS. Снимайте еше
@maximk5620
@maximk5620 2 жыл бұрын
Не понимаю почему так мало подписчиков.. Крайне наглядно и понятно 👍👍
@mishabutuzov
@mishabutuzov Жыл бұрын
Спасибо, очень полезно! Вас приятно слушать
@Oleg_Artemov
@Oleg_Artemov 2 жыл бұрын
Спасибо за ролик ! Очень вовремя он попался :)
@ivanlebedev2608
@ivanlebedev2608 3 жыл бұрын
1. Полезно 2. Делать обязательно
@andreimetro1573
@andreimetro1573 3 жыл бұрын
Спасибо, очень доходчиво, делайте пожалуйста еще!
@MrJloa
@MrJloa Жыл бұрын
Хм. Может IPerson сделать с getSize() и нарисовать декоратор Person, который принимает IMan/IWoman и реализует IPerson. А ваша функция работать будет с IPerson. Так имхо лучше
@2positive1
@2positive1 2 жыл бұрын
Очень полезно. Такого пока не делал, но где-то пригодится.
@nikolasbengal3423
@nikolasbengal3423 3 жыл бұрын
Очень круто, хотелось бы видео по кастомным декораторам
@lesters
@lesters 2 жыл бұрын
а не проще сделать через person instanceOf (Man) и тд ?
@НиколайТурушев
@НиколайТурушев 2 жыл бұрын
В данном примере, разве недостаточно проверки только на наличие поля `braSize`? Проверка на !== undefined выглядит избыточной.
@romanryaboshtan9270
@romanryaboshtan9270 Жыл бұрын
да, кстати, проверка на undefined здесь не нужна
@romanryaboshtan9270
@romanryaboshtan9270 Жыл бұрын
4:06 12-16 строка: можно было тернарником - чуть короче запись
@romanryaboshtan9270
@romanryaboshtan9270 Жыл бұрын
раньше такое не использовал, да, было полезно, можно делать ещё заметки по TS (вопрос: почему нельзя было на 11 строке поставить number | undefined вместо || 0 на 13 строке??)
@user-san-chous
@user-san-chous 2 жыл бұрын
Эх, такой полезный и симпатичный автор тоже завязал с блогерством((
@YarkiiYa
@YarkiiYa 3 жыл бұрын
Большое спасибо, очень помогла!! Респект!
@sergeykudryashov9097
@sergeykudryashov9097 2 жыл бұрын
Круто! Спасибо!
@sprataslavia
@sprataslavia 3 жыл бұрын
А что если использовать паттерн "Стратегия"? мне кажется будет меньше ифов и приведений ;)
@romanryaboshtan9270
@romanryaboshtan9270 Жыл бұрын
hi, 3:50 почему на 17 строке не просто boolean вместо person is Woman??
@kirylsereda
@kirylsereda Жыл бұрын
красава)продолжай
@СергейНайден-б8ч
@СергейНайден-б8ч 3 жыл бұрын
Конечно делать, неплохо же получается. И полезно...
@andar_
@andar_ 3 жыл бұрын
считаю полезным, да делать
@timzak437
@timzak437 3 жыл бұрын
мне больше нравились ваши прямые волосы
@НиколайПрибитков
@НиколайПрибитков 3 жыл бұрын
Контент отличный, спасибо, но есть просьба, делайте пожалуйста размер текста чуть больше, с телефона очень не удобно смотреть. Спасибо)
@frontend-not-for-everyone
@frontend-not-for-everyone 3 жыл бұрын
буду стараться, этот выпуск спонтанный получился)
@DmitriyVetrov
@DmitriyVetrov 3 жыл бұрын
Супер!
@apkartas7416
@apkartas7416 Жыл бұрын
спасибо, куколка)
@ИльяТарасов-ч4у
@ИльяТарасов-ч4у 3 жыл бұрын
Кто чем меряется... А вообще, объяснение классное
@un_defined
@un_defined Жыл бұрын
чеш так мелко то, ну все ж спасиб
@olegkorneev2764
@olegkorneev2764 3 жыл бұрын
лайк :) а если полей не 2, а 10, и отличаются из них, допустим, 3 и больше, то какая стратегия будет, не if-ами же все проверять до бесконечности?
@frontend-not-for-everyone
@frontend-not-for-everyone 3 жыл бұрын
Суть тайпгарда - гарантированно отличить один тип, от другого. Неважно, на какое количество полей отличаются два типа, достаточно найти тот, который точно будет в одном, и не будет в другом. Вот наличие этого поля и поможет решить, с каким именно типом из двух(трех, пяти) вы имеете дело
@alexs7931
@alexs7931 3 жыл бұрын
Если полей много то это анти пример в пользу не использовать TS. Но можно применить кодо-генерацию TS кода, для проверки полей обозначенных специальным форматом, typeNumberNotNull и прочее, но это костыли зато автопроверка будет. Есть ещё .d.ts файлы для таких вещей.
@vasiliykrush2150
@vasiliykrush2150 3 жыл бұрын
было бы круто увидеть такое: ожидается один тип IObject, а мы даем ему object & IObject.. будет ругаться и как это побороть)
@frontend-not-for-everyone
@frontend-not-for-everyone 3 жыл бұрын
Тут проблема глобальная. Не надо делать из тайпскрипта яваскрипт. Весь его смысл как раз в статической типизации, а не динамической. Если на вход поступает IObject и на выходе должен быть IObject нельзя искать обходные пути, чтобы сделать object & IObject. Если же вам нужно получить на вход IObject а на выходе object & IObject, вы описываете новый тип, а внутри метода/функции, делаете маппинг исходных данных в новый тип.
@nikolay501
@nikolay501 3 жыл бұрын
Спасибо за видео, как мне кажется - пример из разряда "typescript generic"
@volchiy_pisun
@volchiy_pisun 2 жыл бұрын
Шрифт сильно маленький, ничего не видно
@MrCortc
@MrCortc 3 жыл бұрын
Аккуратнее с объектами, дочка. Я бы за такие проверки у себя в отделе пальцы ломал, чтобы люди больше никогда программировать не могли. Потому что есть вероятность, что в твою супер-пупер функцию *getSize* проберется какой-нибудь трап const genderqueer = { age: 20, pantsSize: 46, braSize: 'empty' } const size = getSize(genderqueer); // теперь typescript думает, что тип number alert(size); // в реальности тип string
@frontend-not-for-everyone
@frontend-not-for-everyone 3 жыл бұрын
О, наконец-то критика! В функцию getSize не может пробраться трап, т.к. она принимает на вход только указанные типы: Man | Woman И, в общем-то, мне и самой не кажется, что это достаточно безопасная штука, но. Альтернативы? Причем в той реальности, где union types уже используются по всему проекту и нет возможности обойтись без них?
@MrCortc
@MrCortc 3 жыл бұрын
​@@frontend-not-for-everyone Просто скопируйте мой код в свой пример. Вы будете удивлены, что он работает, и typescript не выводит предупреждение об ошибке. Это происходит потому, что typescript проверяет совместимость типов, а не их идентичность. Главное, чтобы объект был объявлен заранее. 1) const size = getSize({ age: 20, pantsSize: 46, braSize: 'empty' }) // работать не будет, typescript выведет предупреждение об ошибке 2) const genderqueer = { age: 20, pantsSize: 46, braSize: 'empty' } const size = getSize(genderqueer); // typescript пропустит, и вы получите некорректную работу вашего кода
@frontend-not-for-everyone
@frontend-not-for-everyone 3 жыл бұрын
@@MrCortc В целом да, так и есть. Но. В тайпгарде имеется насильное приведение входящего объекта к типу Woman. В этом типе поле braSize описано как number | undefined. Если он видит строку - он приводит поле к undefined и возвращает false на проверку яляется ли входящий тип типом Woman. Так что alert вернет размер pantsSize а не строку 'empty'. И да, то что можно подсунуть похожий по структуре объект без насильственного указания типа у переменной, это неприятно, на самом деле, но альтернативы? Тайпгардом для небинарных персон обязательно займемся в следующих выпусках
@MrCortc
@MrCortc 3 жыл бұрын
​@@frontend-not-for-everyone 1) Насильное приведение к объекту типа Woman тут вообще ни при чем. Вы его использовали только для того, чтобы обратиться к методу braSize у объекта person. Вместо return (person as Woman).braSize !== undefined || ("braSize" in person) можно было написать: return "braSize" in person && person.braSize !== undefined конструкция "as Woman" работает в пространстве имен typescript и к undefined в самом js ничего приводить не может. 2) alert вернет строку 'empty'. Не смотрите подсказки, которые генерирует typescript. Мы его с вами только что сломали. Запустите реальный скомпилированный js-код и убедитесь в этом.
@frontend-not-for-everyone
@frontend-not-for-everyone 3 жыл бұрын
@@MrCortcprove me wrong, как говорится: www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgLJxMg3gKGcuAcwgC5kQBXAWwCNoBuPZABwzAGcBlYAL1POp0ojAL44coSLEQoA6gHsqGbEyL9KtBkxpQ47XusHRkAH2QUQAEwgxQES6PEwLCMMHmZiYbnwAUzaHYPMnRMMwUlEABKMg0hFXxgGF9gdgiMf0CPKKiE-GQoCDAKKEwAqCCQADodPQNTMwAGRnwRZAgAG3YUXHyCopKyrOrWcC56kzMARhbkMTEcZxBXd0xU9JBMiuC0ZXDFDBiWYeRU5A28hA92MGQEAAsIBABrZABeY+3MPXODkEYmFcQEEOhAqh15IRfA8ns8arp9HwogD8IViqVkFtKgR2L9IlF4XU+MgAIRvD4Way2ED2BqYgBEtUREHppyGX2ROAWQJuyAA7n8pmQLh9egRiGQpgAOAA02gRBjIlJsdksXPEPNuxCs0AAjhQIMZReL+AAmRoylhscZ8MgAFgAbJbaj5+AByCBUZhgACebrm4jgoKgYF8XldYYgOqg+sNUBy9CAA
@VeseliePorubasi
@VeseliePorubasi 3 жыл бұрын
sps
@merovingen4546
@merovingen4546 2 жыл бұрын
боже... какие костыли ради проверки типа... камень не в автора, а в сам TS
@wh1teb1ack92
@wh1teb1ack92 2 жыл бұрын
Это точно. А если там будет не по 2 свойства в объекте, то это вырастет в такую кашу. Надо это делать как-то проще, или заменять, я хз
@макс-х9п9л
@макс-х9п9л Жыл бұрын
Не понял прикола. Какой смысл передавать в аргументы тип Man, если функция должна возвращать Woman? Убрать Man из аргумента и не потребуется этот type guard. В общем сами создали себе проблему и решаем её, ясно
@romanryaboshtan9270
@romanryaboshtan9270 Жыл бұрын
дело в том, что такие примеры встречаются на практике, когда функция работает с разными типами и выполняет похожие действия, поэтому здесь разбирается этот вопрос
TypeScript - Union типы и TypeGuards
9:44
PurpleSchool | Anton Larichev
Рет қаралды 9 М.
Как использовать keyof оператор
18:26
easydev
Рет қаралды 1,3 М.
any vs unknown vs never: TypeScript demystified
8:01
Andrew Burgess
Рет қаралды 25 М.
TypeScript Type Guards Explained
8:43
Software Developer Diaries
Рет қаралды 10 М.
Unit-тестирование в Angular. Jasmine, Karma, Test coverage report
23:20
Frontend не для всех
Рет қаралды 18 М.
TypeScript #10 Общие типы (Generic)
7:20
webDev
Рет қаралды 42 М.
Infer is easier than you think
13:38
Matt Pocock
Рет қаралды 95 М.