I personally find the second option more favorable. Let's take a look at this example (not using observables, but simple Set objects)
const someData: Set<number> | Set<number[]> = new Set();
const someData2: Set<number | number[]> = new Set();
someData.add(2); // Cannot invoke an expression whose type lacks a call signature. Type '((value: number) => Set<number>) | ((value: number[]) => Set<number[]>)' has no compatible call signatures.
someData.add([2, 3, 4]); // Cannot invoke an expression whose type lacks a call signature. Type '((value: number) => Set<number>) | ((value: number[]) => Set<number[]>)' has no compatible call signatures.
someData2.add(2);
someData2.add([2, 3, 4]);
It is evident that the first approach only works if you cast the something object, which can introduce unnecessary complexity to your code:
(someData as Set<number>).add(2);
(someData as Set<number[]>).add([2, 3, 4]);