Давайте начнем этот пост с этого фрагмента кода.

Оба вызова bodyMassIndex не вызовут никаких предупреждений в TypeScript, даже если второй вызов имеет перегруженный параметр в ключе name. Что касается набора текста в TypeScript, то он не настолько строг.

Например, контракты или interface в TypeScript могут иметь необязательные свойства. Более того, его конкретная реализация может иметь больше свойств, чем определяет interface. Кто-то может сказать, что это неправильный способ заключения контрактов, но, по крайней мере, для меня это лучше, чем полное отсутствие контракта.

Вернуться к посту.

Я видел, как оператор распространения широко используется в проекте, который я поддерживаю на работе. Часто это используется при сопоставлении некоторых параметров, которые передаются извне приложения. Например, полезная нагрузка JSON из клиентского приложения, которая может в конечном итоге что-то изменить на уровне базы данных. Здесь следовало добавить предупреждение.

Как подчеркивалось во введении к этому сообщению, ввод TypeScript просто гарантирует, что передаваемое вами значение по крайней мере соответствует типу. Если у вас есть еще какие-то свойства в вашем значении объекта, не проблема! Что ж, технически проблем нет. С точки зрения бизнеса, вам может быть сложно отследить проблему.

Представьте, что полезная нагрузка JSON включает некоторые другие значения, которых вы не ожидали там увидеть. Скажем, в нем есть поле ownerId, указывающее, кто может получить доступ к ресурсу. Если код слепо распределяет полезную нагрузку по вызову репозитория, теперь любой может изменить владельца ресурса.

Пример может быть надуманным, но я действительно вижу, как на моей работе в приложении производственного уровня происходит много распространений, которые когда-нибудь могут произойти.

Так что же нам тогда делать?

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

Еще один способ исправить ситуацию - каждый раз проверять ценность. Для объектов вам могут помочь такие пакеты, как class-validator. Это могло быть менее подробным, чем предыдущее. Так что это может быть хорошим вариантом для вас.