openlang

getItem, null и external в ReScript

Проверка типов в ReScript строгая ровно до той строки, где external сообщает ей, что возвращает какая-то функция JavaScript. Дальше она просто верит на слово. Привяжите getItem из localStorage как возвращающую string, и каждый вызывающий сможет обращаться с результатом как со строкой, хотя браузер вернёт null для отсутствующего ключа. Во время выполнения ничего не проверяется. В этом весь смысл бесплатных привязок, и именно здесь безопасность типов тихо заканчивается.

Честная привязка возвращает Nullable.t<string> и один раз, там, где значение входит в программу, превращает его в option, так что остальной код интерфейса сопоставляет Some и None и не может забыть пустой случай. У TypeScript та же слабость в файлах .d.ts. Там она просто выглядит привычнее.

Что до сих пор не решено, так это сколько оборачивать. Тонкая привязка плюс одна функция преобразования обходятся дёшево. Отдельный модуль, написанный руками для каждой библиотеки, надёжнее и устаревает при каждом её изменении.

Разговор продолжается 1

Следуя доводам
  1. Ссылка на ответ

    Преобразуйте на входе, дальше ничто не предупредит. string из библиотеки C#, собранной без nullable-контекста, считается oblivious, и его разыменование тоже не даёт предупреждений.

Другие стороны того же вопроса

  1. Надпись изменилась, но появилась ли она на экране?

    Промис выполнен. Реакция меняет метку с Loading на Calculating. Идёт долгий синхронный расчёт. Метка становится Done. Проще в…