export const getKeys = (o: T) => Object.keys(o) as Array export const getValues = (o: T) => Object.values(o) as Array export const getEntries = (o: T) => Object.entries(o) as Array<[keyof T, T[keyof T]]> export type Writeable = { -readonly [P in keyof T]: T[P] }; type EnumBaseType = Record export const getEnumKeys = (en: T): Array => { const arr = getValues(en) return arr.slice(0, arr.length / 2) as any as Array } export const getEnumValues = (en: T): Array => { const arr = getValues(en) return arr.slice(arr.length / 2) } type EnumReverse = {[K in T[keyof T]]: keyof T} export const getReversedEnum = (en: T): EnumReverse => { const arr = getValues(en) const result = {} as any for (let i = 0; i < arr.length/2; i++) { result[arr[i + arr.length/2]] = arr[i] } return result } export const safeJSONParse = (str: string): T | string => { try { return JSON.parse(str) as T } catch { return str } }