Having them each extended from tr_base_item is a good idea. Each component should upcast the base_item to the particular item it is expecting before operating on it.
However, there is no need to downcast an item_*_h to a tr_base_item before sending it. Since item_1 extends tr_base_item, it IS a tr_base_item, so passing it through a port/export that is expecting a tr_base_item is fine. The only reason you need to upcast on the receiving end
$cast(item_1_h, tr_base_item)
is so that the receiving component can then refer to item_1_h fields.