I have a class with static properties and I want to get a list of all property values:
class TimeRange {
static ALL = 'all time'
static MONTH = 'month'
static WEEK = 'week'
static DAY = 'day'
}
Now I want to get: ['all time', 'month', 'week', 'day']
Advertisement
Answer
What’s your use case here? If you’re looking for a way to have some properties that you can iterate through but also refer to by key, then you can just use a normal object:
const timeRanges = {
ALL: 'all time',
MONTH: 'month',
WEEK: 'week',
DAY: 'day'
}
timeRanges.ALL; // 'all time'
timeRanges.MINUTE; // not allowed
Object.keys(timeRanges).map(key => timeRanges[key]); // ['all time', 'month', 'week', 'day']
Classes are not really designed to have their properties iterated through. However, if they absolutely must be in a class, you could turn them into instance properties follow the method outlined here:
class TimeRange {
ALL = 'all time'
MONTH = 'month'
WEEK = 'week'
DAY = 'day'
}
Object.getOwnPropertyNames(new TimeRange()); // ['all time', 'month', 'week', 'day']
That’s somewhat of an anti-pattern, though.
One final option you might consider would be to use a string enum:
enum TimeRange {
ALL = 'all time',
MONTH = 'month',
WEEK = 'week',
DAY = 'day'
}
Object.keys(TimeRange).map(key => TimeRange[key]); // ['all time', 'month', 'week', 'day']
(To clarify, I’m assuming you’re using Typescript here based on the tags in the question. If you’re not, then the comments on your original question stand. You could still use options 1 and 2 that I suggest here, but obviously without the type checking benefits.)