Мы постоянно говорим в команде Dart о том, как улучшить язык (как типы, не допускающие значения NULL), и одна из особенностей, которая неофициально всплыла несколько раз, - это перегрузка функций:

В некоторых языках программирования перегрузка функций или методов - это возможность создавать несколько методов с одним и тем же именем с разными реализациями. Вызов перегруженной функции запускает конкретную реализацию этой функции, соответствующую контексту вызова, позволяя одному вызову функции выполнять разные задачи в зависимости от контекста.

Короче говоря, это означает, что вы можете написать такой код (вот пример Java):

Небольшое примечание: это не официальная позиция ни Dart, ни Google, и она также не предназначена для того, чтобы рассматриваться как негативное изображение TypeScript, а скорее просто сравнение различных преимуществ (и недостатков). обоих языков - например, TypeScript сегодня поддерживает типы объединения, а Dart - нет.

Мы не можем сделать это (пока) в Dart (или JavaScript, или TypeScript), но вы можете:

Конечно, это не очень эргономично. Мы также могли бы опустить определение типа и полагаться на проверку времени выполнения (в Dart) или использовать тип объединения (в TypeScript):

Обратите внимание, что в обоих случаях мне нужно было выполнить дополнительные проверки типов во время выполнения, чтобы знать, как отправить что-то в соответствующий блок кода. Мне не нужно было делать это на Java.

Вы можете спросить - что в этом плохого? Что ж, все в порядке неправильного, но, безусловно, вы можете увидеть проблемы с обеими реализациями, по крайней мере, по сравнению с Java и другими языками:

  1. И в TypeScript, и в Dart нет проверок времени выполнения на уровне языка - вам нужно вручную утверждать, что был предоставлен неожиданный тип. Это должно сохраняться при изменении иерархии типов.
  2. И в TypeScript, и в Dart есть накладные расходы на производительность во время выполнения - представьте, что вызов потреблять в жестком цикле сотни или тысячи раз - компилятор.
  3. В TypeScript есть накладные расходы размера кода - даже если вы пьете только воду и никогда не едите пищу, вы все равно скомпилируете и отправите случай ошибки и случай воды в продакшн (это не относится к Dart , увидеть ниже).
  4. В Dart нет статических проверок, когда вы указываете неправильные типы. Тип является неявно динамическим (любым в TypeScript), что не является тем опытом, к которому большинство пользователей привыкло со строго типизированными API-интерфейсами Dart.
  5. В TypeScript статические проверки ограничены структурными, а не номинальными типами. Это означает, что это полностью законно и не приведет к статическим ошибкам:

Частично сотрясение деревьев на помощь

Как отмечалось выше, в Dart пока нет перегрузок методов, но есть довольно мощная функция «встряхивания дерева». Например, предположим, что следующая (теперь уже знакомая) программа Dart:

Вы можете угадать, в какой код JavaScript он компилируется?

Правильно - dart2js оптимизировал его до одного оператора печати. Вы можете узнать больше о расширенной оптимизации, которую делает dart2js, из выступления на саммите разработчиков Dart за прошлый год:

Хорошо, а как насчет перегрузки?

Dart, в отличие от TypeScript, использует систему номинальных типов, а не систему структурных типов. С нашей новой системой типов звука можно доказать, что такое входящий тип чего-либо, и мы могли бы статически отправлять это. Представьте себе этот скомпилированный JavaScript (еще не поддерживаемый):

Если это то, что вы хотели бы увидеть в Dart, не стесняйтесь оставлять комментарии здесь или на GitHub, чтобы мы помогли расставить приоритеты. Надеюсь, вам понравился этот короткий блог!