Тайп-фу в TS

Oct 17, 2021 10:30

У нас тут есть сторонний HTTP-сервис, возвращающий либо { success: true } либо { error: 42, description: "because" }. Ну и по openapi.yaml генерится в таком духе декларация (за правильность кейвордов не ручаюсь):

export interface Foo {
bar:
| { success: boolean }
| { error: number, description: string }
}Ну и есть ( Read more... )

fp, все пидарасы а я, programming

Leave a comment

Comments 13

rdia October 17 2021, 15:06:30 UTC
> (то, что throw обрывает control flow - он тоже видит).

А если там вызов функции, которая 146% выбрасывает исключение, он тоже узнает, что есть обрыв потока управления? Например

function throw_new_Error(desc) {
throw new Error(desc)
}

....

if ('error' in foo) {
throw_new_Error(foo.description)
}

> Ну и это конечно непонятно как на наших гребцов ляжет. Разрешу им везде as unknown as any писать чтобы батька потом чинил :)

А нельзя перед написанием кода с алгебраическими типами слегка подумать? Это же язык с выводом типов, там всегда можно добавить ещё один вариант. Конечно, оно не такое гибкое, как какой-нибудь Питон/JS, где можно лепить вообще поток сознания. Но это и не кондовый Java.

Reply

nponeccop October 17 2021, 18:21:07 UTC
> А если там вызов функции, которая 146% выбрасывает исключение, он тоже узнает ( ... )

Reply


binf October 18 2021, 06:51:47 UTC
На голанг/джава/петон для внешнего хз-как-сделанного апи создаётся доп слой , изолированный в отдельный пакет - типизированный апи + убрать всё лишнее.
С этим справится любой галерщик за 2-3 стори пойнта - легко найти виноватого, легко сопрорвождать, изолировать баги, саппортить
Это на много надёжнее чем дрочить с типами.
Пакет ставится через управление зависимостями, в го с этим проще в разы чем в джавапетоне (поэтому нахуй джавапетон)
Что там внутри этого пакета - ебля с типами или any , да насрать вообще . Лишь бы 100% каверидж, потому что это внешнее апи
Этот же подход в принципе универсален - не только для внешнего апи, но и например для фряшной zfs

Reply

nponeccop October 18 2021, 12:15:04 UTC
Ну этот подход очевидный, и себя у нас, в-общем, зарекомендовал, единственное, что букв много.

Ну и вот для экономии букв вместо этого предлагается лепить псевдо-OpenAPI спеку. Это пилотный маленький проект, так что посмотрим на реакцию гребцов и по итогам в будущих проектах уберём то, что окажется слишком "заумным".

Вопрос был скорее, как выглядит типизированный API для работы с вариантами/ветвлениями/юнионами/типами-суммами. А уж как он написан - руками ли или генератором - дело десятое.

Reply

binf October 18 2021, 14:40:19 UTC
> Ну и вот для экономии букв вместо этого предлагается лепить псевдо-OpenAPI спеку

то есть openapi.yaml это ваше творчество, и вы хотите написать сваггер спеку для внешнего апи ? Слишком хитрый план. Тупо беру первое попавшееся под руку широко используемое апи elasticsearch, и не вижу ни одной попытки его сваггеризировать (хотя там тоже можно навертеть тайп сумм), зато много много биндингов/сдк. Но сама идея написать спеку сваггера по доке мне нравится. Теоретически можно получить профит если вы пишете клиентов для внешнего апи на разных языках , например гуи для всех на свете платформ например. Но опять таки сомневаюсь что это в принципе возможно, иначе эластик бы сваггеризировали, а не писали биндинги к нему

> как выглядит типизированный API

играл в эту же игру давно на F# . Взял betfair API, и такой - а давайте распишем обёртки для всех вызовов с тайпсуммами etc. Результат более чем разочаровал, мб потому что F# всратый язык.

Reply

nponeccop October 18 2021, 15:49:21 UTC
> Тупо беру первое попавшееся под руку

А это у вас просто reproduction. А у меня free inquiry, другой подход. К сожалению, потерял ссылку на free inquiry.

> Но сама идея написать спеку сваггера по доке мне нравится.

Не совсем. План ещё хитрее. План стар как мир - на внешние интерфейсы (из которых может прийти "что попало") посадить IDL, по которому генерить и типы, и рантайм-валидатор.

В качестве этого идла использовать (в вольной манере) жсон схему/openapi.

Ну и идея сэкономить путём написания вместо двух простыней одной "упрощённой" и "стандартной" простыни. Ну и унифицировать везде логику валидации, чтобы она "когнитивно не мозолила глаза".

Отчасти это из-за отстутствия дсл для типизированных парсеров жсона (который есть, например, в C#).

> Результат более чем разочаровал

Ну тут вопрос о том, что вынос работы с апи в типизированный модуль так или иначе все делают. И вопрос был о том, как выглядит этот типизированный модуль в общем виде. При этом не обязательно оборачивать вызовы "один в один".

Reply


jakobz October 18 2021, 07:04:12 UTC
nponeccop October 18 2021, 11:43:08 UTC
Впечатляет

Reply

nponeccop October 18 2021, 12:20:42 UTC
Это к вопросу о "пока они будут думать, у нас все дедлайны упадут"? Какой-то развёрнутый комментарий по поводу работы с TS есть?

Меня вот привлекают 3 вещи:

- вебсторм (в условиях, когда команда умеет лепить рефакторингами)
- ловля забытых ретурнов и эвэйтов
- сокращение рантайм-проверок, так как всё делается "на входе", и в дальнейшем коде нуллов не может быть

Второе, как я понимаю, чисто жс-проблема и лечится переходом на условный Го/шарп.

Reply

jakobz October 19 2021, 05:51:11 UTC
Ну, мы тайпскрипт по-полной юзаем. У нас и по API-ке типы генерятся. А т.к. в одной репе и фронт, и бек, то сломать аппу API-шкой уже довольно сложно, билд упадёт. Думаю мы про целые классы ошибок забыли. Иной раз приходится лязить в чисто-js-ный код - и непонятно как люди живут.

Но с типами можно навернуть так, что сам потом не разберешься. Ну или в тайпинги библиотек залезть и офигеть. В общем, бывает непросто. И то что там в type-challenges - меня даже и не пугает. Но оно того стоит.

При этом всём, система типов не сильно тебя ограничивает, как в том же C#. Возможности динамического языка - не сильно теряются.

Так что TS - лучшее что случилось с фронтом в этом веке, после реакта. Какой-то так.

Reply


Leave a comment

Up