Вы забыли Haxe. Мне потребовалось некоторое время, чтобы запустить ваши кейсы с Haxe, чтобы продемонстрировать, как это делать / как выглядят ошибки.

Haxe - это современный высокоуровневый язык программирования со строгой типизацией и быстрым оптимизирующим кросс-компилятором. С Haxe вы можете создавать кроссплатформенные приложения, ориентированные на JavaScript, C ++, C #, Java, Python, Lua, PHP, Flash, HashLink и NekoVM, и обеспечивает доступ к собственным возможностям каждой платформы.

Чтобы узнать больше о выводе типа Haxe, прочтите: https://haxe.org/manual/type-system-type-inference.html

Случай 1: вывод в локальной области

class Test {
    static function main() {
        var x = 2;
        if (Math.random() > 0.5) {
          x = "bla";
        }
    }
}

демо: https://try.haxe.org/#17ef5

Ошибка:

Test.hx:5: characters 10-19 : String should be Int

Случай 2: вывод между функциями

class Test {
    static function main() {
        function doSomething(x) {
          js.Browser.console.log(x.foo); // <--- Error here
        }
        var s = {bar: 100};
        doSomething(s);
    }
}

Демо: https://try.haxe.org/#3d6d9

Ошибка:

Test.hx:7: characters 20-21 : { bar : Int } should be { foo : Unknown<0> }
Test.hx:7: characters 20-21 : { bar : Int } has no field foo
Test.hx:7: characters 20-21 : For function argument 'x'

Случай 3: строгий режим

В Haxe нет разных типов строгих режимов, он всегда строгий.

Случай 4: Логический вывод по функциям, часть 2

import js.Browser.console;
class Test {
    static function main() {
        inline function ohWaitOneMoreThing(x) {
          console.log(x.foo); // <--- Error here
        }
        inline function doSomethingElse(x) {
          console.log(x);
          ohWaitOneMoreThing(x);
        }
        inline function doSomething(x) {
          console.log(x);
          doSomethingElse(x);
        }
        var s = {bar: 100};
        doSomething(s);
    }
}

Демо: https://try.haxe.org/#CBe18

Ошибка:

Test.hx:17: characters 20-21 : { bar : Int } should be { foo : Unknown<0> }
Test.hx:17: characters 20-21 : { bar : Int } has no field foo
Test.hx:17: characters 20-21 : For function argument 'x'

Боковое примечание: функции должны быть объявлены в обратном порядке вызова, чтобы сделать их доступными для точки вызова ниже.

Случай 5: Количество «любых» типов в lodash определениях библиотеки

Haxe: N / A (нет привязок для lodash afaik)

Выводы

🙏 Haxe стоит попробовать.

Для тех, кто не знаком с Haxe, он включает:

  • Кросс-платформенная стандартная библиотека
  • Классы, интерфейсы и наследование
  • Абстрактные типы
  • Анонимные типы
  • Вывод типа
  • Понимание массива
  • Условная компиляция
  • (Обобщенные) алгебраические типы данных
  • Встроенные вызовы
  • Итераторы
  • Локальные функции и закрытия
  • Метаданные
  • Статические методы расширения
  • Строчная интерполяция
  • Приложение с частичной функцией
  • Сопоставление с образцом
  • Характеристики
  • Параметры типа, ограничения, дисперсия
  • Отражение
  • Макросы AST
  • Статический анализ
  • Удаление мертвого кода