Артём Кобзарь — Как и зачем я пишу свой статический типизатор

preview_player
Показать описание
Ближайшая конференция — HolyJS 2024 Autumn, 7 ноября (online), 14–15 ноября (Санкт-Петербург + трансляция).
— —
. . Артём — приверженец следующего подхода: «Чтобы эффективно что-то использовать — нужно написать свой аналог». Он расскажет о том, как работают самые популярные на сегодняшний день решения для статической типизации и как он пишет свое собственное решение.
Рекомендации по теме
Комментарии
Автор

Не могу отделаться от ощущения что про статическую типизацию в JS мне рассказывает Лев Против >_<'
Доклад отличный!

rselivanov
Автор

На сегодня проект закрыт. Артём, спасибо за попытку сделать лучше 👍🏼

pick-pock
Автор

такие доклады очень круты - выявляют проблемные места распиареных технологий. не всё так гладко в мире TS.

fgngejw
Автор

Очень крутая идея! С интересом слежу за вашим проектом. Но до успеха ему, в лучшем случае, лет 4-5 нужно будет.

Как финансируется проект? Или это хобби проект на энтузиазме?
Если вы читаете .d.ts файлы - как обрабатываются их Typescript типы, например тот же any?

mephistotel
Автор

А как без проверки типов в рантайме валидировать/типизировать приходящие с сервера данные?

jeststk
Автор

31:40 - пошла жара. TS действительно имеет проблему, но она там взялась не из-за того, что авторы TS идиоты. Структурная типизация даёт множество фишек, а в замен даёт одну проблему. И из этого никак не следует, что решение плохое и его нужно поменять. Просто нужно добавить хинт.
Но, автор опять пытается всех обмануть. Его примитивная система типов не способна дать то, что может дать TS. И она попросту убога. Но что же он говорит? Он говорит, что так и нужно. Нужно убого. Он опять пытается выдать слабость за фичу.
32:10 - враньё переходит уже все границы. Автор показывает некую особенно TS и говорит "нельзя" и вы думаете, что действительно нельзя. Но всё можно - id<T>(x: T) {return x;}. Причём это не является проблемой, потому как если функция будет объявлена в контексте, где уже описана её сигнатура - она возьмёт сигнатуру из контекста. А если ты вне контекста хочешь создать генерик-функцию - объяви это явно. Это поведение обусловлено совместимостью с js.

rustonelove
Автор

Пример #1 на ts V 4.9 пофикшен уже выводится number | undefined, пример с id очень легко типизировать через шаблон ```const id = <T>(x: T): T => x;```, проблемы связанные со структурной типизацией решаются брендированием

dmitry
Автор

Я даже не буду говорить о какой-то там выразительности и том, что это бездарное дерьмо никогда не сможет в подобное. Сейчас не об этом. Хотя выразительность в данном случае так же обусловлена системой типов и её мощностью, но то тоже ладно.
Проблема здесь следующая. С++ знает, что есть несколько типов трансформаций и несколько типов контейнеров. Вектор является RA-контейнером. Если мы применим к нему трансформацию, которая сохраняет RA - оно будет работать. transform - это ваш map.
А вот фильтр не сохраняет RA и после нельзя применить [], которые подразумевают RA. RA в данном случае - random access, т.е. доступ по индексу за O(1).
У вас была примитивная вариация такого подхода - это пример с model. Дак вот - раст в такое не может. Там нету вывода типов. И пародия на них в лябмдах никак не помогает, потому как это не С++/js-лямбды и их применение крайне ограничено. Да даже в C++ применение лямбд ограничено, как и в js.

rustonelove
Автор

38:40 - никакого подхода раста не существует. Ну ведь автор ничего не знает про раст и типизацию - зачем он пользуется тем, что его ЦА не знает ещё больше? Раст на 90% состоит из динамического диспатча как по интерфейсам так и по юнионам. Для того, что-бы такое делать - нужно знать типы в рантайме. Тоже самое пусть автор погуглит про std::any, typeid и прочее. Либо почитает про С++ откуда всё это было взято.
В любом случае раст никакого отношения к языком "полностью типизированным" не относится. Типизация там хуже, чем в TS.
38:50 - можно. Но это не про раст и не про js.
39:35 - как хорошо быть жертвой пропаганды. Ничего не знает, но экспертно заявляет. В расте всё это есть. И null pointer и какой угодно поинтер. И к системе типов это не имеет никакого отношения.
39:40 - невежество в массы. Никаких null pointer exception в С++ нет и быть не может. Автор перепутал с жавой. И к типизации это не имеет никакого отношения. Это как деление на ноль. Или ещё любая другая рантайм-ошибка. Которая никак не обрабатывается убогой системой типов автора. И аналогичной оной системой типов раста.
39:45 - хорошая система и проверка типов? В расте? Ну про жертву пропаганды я уже говорил.
39:46 - всё что нужно знать об данном эксперте. Раст уже не нормальный язык, потому как там есть any. Как же так?

rustonelove
Автор

29:45 - пошло враньё. Автор здесь пытается вам обмануть, а именно выдать убогость своего вывода типов за фичу. Если проще - то, что здесь показано - это не слабость TS - это специальные фичи, которые расширяют типизацию. А автор показывая вам своё изваяние называет дефолтное поведение фичёй.
Строгость типизации никак не относится к явно. Когда вам говорят обратное - вас пытаются обмануть. Задача типизации полностью покрыть рантайм-логику. И если в рантайм-логике этот неявный каст существует - он должен быть описан на уровне типов. Автор же просто не осилил и решил выдать слабость за фичу.
Это очень просто проверяется - почему же он не показал ОШИБКИ, которые допустим ts неявными кастами? Правильно, потому что их нет.
29:56 - А далее автор опять пытается всех обмануть. То, что твоя примитивная система описания типов не позволяет учитывать неявные трансформации типов - это проблема твоей типизации(убогой). И автор убогость выдаёт за фишку.
30:30 - это позор. Автор просто начал манипулировать. Следим за руками. Контекст у нас "различия между моим и ТС" и тут бам - он показывает что-то. И мы должны думать, что в TS всё не так. Но нет - там всё так же. И зачем этот пример привёл автор?
30:46 - здесь автор совсем поломался. js скриптуха и никак не может быть полностью типизирован, потому как типы в нём вторичны. По этой причине все рантайм-проверки не должны учитывать типизацию - это базовое правило. Авторы TS его осилил, а данный эксперт нет. Да, оно бесполезно.

rustonelove
Автор

Меня не перестаёт удивлять то как веб-гении с ничтожными познаниями берутся рассуждать о расте, С++. Понимаю, что там с тебя никто не спросит, но всё же.
9:58 - C++ не имеет вывода типов в твоём понимании. Типизация в С++ - это совершенно другая реальность, которая настолько сильно превосходит всё, что ты знаешь.
10:00 - никакого вывода типов в расте нет. Как же эпично обманул вас этот эксперт. В расте есть вывод типов(ну как вывод - огрызок для примитивных кейсов) только для лябд.
10:02 - типы не проаннотированы и в С++. Пациент либо не знает, либо в очередной раз пытается вас обмануть. Дело в том, что в C++ auto - это не только типовая аннотация. Это ещё и признак декларации. И везде он используется именно как признак декларации - как аннотация он не имеет смысла. И о чудо, если мы уберём эту аннотацию - мы потеряем признак декларации. И это решается костылём let, которого нет в С++. А let - это говно, по определению. Причина тому проста. Признаком декларации в С++ является любая аннотация, а не только auto.
И если мы желаем написать string x; - мы там и пишем. В костыльном let-говне мы так не можем. Мы обязаны оставить let и получить let x: string.

rustonelove
Автор

Отличный инженерный подход, красавчик !

SuperArtgun
Автор

Это было очень круто, спасибо!
Подписался, поддержу

sergeyvolkov
Автор

доклад можно было переименовать: "До чего доводит flow"

dmitry
Автор

Крутой чувак . Смотрел стримы как он разрабатывал этот типизатор .

telychkomykola
Автор

Сколько раз он выпил водички в конце?)))

vladikboldakov