Мы постоянно говорим в команде Dart о том, как улучшить язык (как типы, не допускающие значения NULL), и одна из особенностей, которая неофициально всплыла несколько раз, - это перегрузка функций:
В некоторых языках программирования перегрузка функций или методов - это возможность создавать несколько методов с одним и тем же именем с разными реализациями. Вызов перегруженной функции запускает конкретную реализацию этой функции, соответствующую контексту вызова, позволяя одному вызову функции выполнять разные задачи в зависимости от контекста.
Короче говоря, это означает, что вы можете написать такой код (вот пример Java):
Небольшое примечание: это не официальная позиция ни Dart, ни Google, и она также не предназначена для того, чтобы рассматриваться как негативное изображение TypeScript, а скорее просто сравнение различных преимуществ (и недостатков). обоих языков - например, TypeScript сегодня поддерживает типы объединения, а Dart - нет.
Мы не можем сделать это (пока) в Dart (или JavaScript, или TypeScript), но вы можете:
Конечно, это не очень эргономично. Мы также могли бы опустить определение типа и полагаться на проверку времени выполнения (в Dart) или использовать тип объединения (в TypeScript):
Обратите внимание, что в обоих случаях мне нужно было выполнить дополнительные проверки типов во время выполнения, чтобы знать, как отправить что-то в соответствующий блок кода. Мне не нужно было делать это на Java.
Вы можете спросить - что в этом плохого? Что ж, все в порядке неправильного, но, безусловно, вы можете увидеть проблемы с обеими реализациями, по крайней мере, по сравнению с Java и другими языками:
- И в TypeScript, и в Dart нет проверок времени выполнения на уровне языка - вам нужно вручную утверждать, что был предоставлен неожиданный тип. Это должно сохраняться при изменении иерархии типов.
- И в TypeScript, и в Dart есть накладные расходы на производительность во время выполнения - представьте, что вызов потреблять в жестком цикле сотни или тысячи раз - компилятор.
- В TypeScript есть накладные расходы размера кода - даже если вы пьете только воду и никогда не едите пищу, вы все равно скомпилируете и отправите случай ошибки и случай воды в продакшн (это не относится к Dart , увидеть ниже).
- В Dart нет статических проверок, когда вы указываете неправильные типы. Тип является неявно динамическим (любым в TypeScript), что не является тем опытом, к которому большинство пользователей привыкло со строго типизированными API-интерфейсами Dart.
- В TypeScript статические проверки ограничены структурными, а не номинальными типами. Это означает, что это полностью законно и не приведет к статическим ошибкам:
Частично сотрясение деревьев на помощь
Как отмечалось выше, в Dart пока нет перегрузок методов, но есть довольно мощная функция «встряхивания дерева». Например, предположим, что следующая (теперь уже знакомая) программа Dart:
Вы можете угадать, в какой код JavaScript он компилируется?
Правильно - dart2js оптимизировал его до одного оператора печати. Вы можете узнать больше о расширенной оптимизации, которую делает dart2js, из выступления на саммите разработчиков Dart за прошлый год:
Хорошо, а как насчет перегрузки?
Dart, в отличие от TypeScript, использует систему номинальных типов, а не систему структурных типов. С нашей новой системой типов звука можно доказать, что такое входящий тип чего-либо, и мы могли бы статически отправлять это. Представьте себе этот скомпилированный JavaScript (еще не поддерживаемый):
Если это то, что вы хотели бы увидеть в Dart, не стесняйтесь оставлять комментарии здесь или на GitHub, чтобы мы помогли расставить приоритеты. Надеюсь, вам понравился этот короткий блог!