A thread I made for same problem not long ago.
I am making any inventory items derive from a Uobject class that holds the basic data common to all items.
Items that need decay derive from a child class of that Uobject which also implements whatever functionality you need for decay/condition.
Any data that doesn’t change you can hold in a data table. The stuff that might change at runtime (condition) you can keep in a struct. But you just save the whole Uobject so it’s still easy to manage.