I am trying to create a way to easily generate a type that defines a multitude of key values association with a specific name pattern in the keys.
I have a specific type that is very repetitive, as for any metrics (working on analytics), I have a 4 keys associated.
For example, for the firstPageVisible metric, I will have firstPageVisibleMetrics, firstPageVisibleCount, firstPageVisibleMetricsPerDevices, firstPageVisibleCountPerDevices.
But as I have many metrics, I would like to have some sort of factory to make is easier to read.
I was imagining something like :
type DetailedMetric<Type> = (
name: string,
) => {
[`${name}Metrics`]?: Type;
[`${name}Count`]?: number;
[`${name}MetricsPerDevices`]?: PerDeviceData<Type>;
[`${name}CountPerDevices`]?: PerDeviceData<number>;
};
But I am having the error : A computed property name in a type literal must refer to an expression whose type is a literal type or a 'unique symbol' type..
And I cannot find a satisfying way to resolve this.
In the end, I would like to have something that looks like this (or similar) :
type StoryDataType = {
_id: string;
...;
} & DetailedMetric("firstPageVisible")<number> &
DetailedMetric("metric2")<number> &
DetailedMetric("metric3")<number> &
DetailedMetric("metric4")<number> &
...;