Для начала, в TS
структурная типизация, что значит что типы определяются по содержимому а не по объявлению как в номинальной.
Под тип пустого интерфейса подходит всё кроме null и undefined. И как правильно отметил
WbICHA в комментариях, данные интерфейсы полностью эквивалентны.
Допустим, что Foo и Bar всё же содержат в своем описании какие-либо поля, и это разные типы. Тогда тип
(Foo|Bar)[]
позволит передать в себя массив, каждый элемент которого может быть как Foo так и Bar. Проверить тип всех элементов можно лишь пройдя итерацией весь массив.
Если хотим, чтоб все элементы массива были одного типа, только Foo или только Bar, то нужно принимать такой аргумент
Foo[] | Bar[]
, в этом случае достаточно проверки элемента с индексом 0.
Ну и наконец любая вариация этих типов допускает пустой массив, из которого тип элементов определить невозможно.