ts-lib-extended
Version:
Additional types and tools for typescript
63 lines (62 loc) • 1.65 kB
JavaScript
/**
* Gain keys and values from enum instances. Works with string, numeric and mixed enums
* (properly ignoring the numeric index reverse lookup entries for numeric enums)
*
* @export
* @class EnumerableObject
* @since 1.2.0
*/
export class EnumerableObject {
/**
* Gain enum values (equivalent to Object.values(...))
*
* @public
* @template {Enumerable} E
* @param {E} enum_
* @returns {ReadonlyArray<EnumerableValue<E>>}
* @since 1.2.0
*/
values(enum_) {
const values = [];
this.disassemble(enum_, (key_) => values.push(enum_[key_]));
return values;
}
/**
* Gain enum keys (equivalent to Object.keys(...))
*
* @public
* @template {Enumerable} E
* @param {E} enum_
* @returns {ReadonlyArray<keyof E>}
* @since 1.2.0
*/
keys(enum_) {
const keys = [];
this.disassemble(enum_, (key_) => keys.push(key_));
return keys;
}
/**
* Gain enum entries (equivalent to Object.entries(...))
*
* @public
* @template {Enumerable} E
* @param {E} enum_
* @returns {ReadonlyArray<EnumerableEntry<E>>}
* @since 1.2.0
*/
entries(enum_) {
const entries = [];
this.disassemble(enum_, (key_) => entries.push([key_, enum_[key_]]));
return entries;
}
disassemble(enum_, processKey_) {
const keys = Object.keys(enum_);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
if (/^[0-9]+$/.exec(key)) {
continue;
}
processKey_(key);
}
}
}