type MaxBits64 = 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63; export function bitmaskMap< FlagsT extends (readonly string[] & { length: MaxBits, }), MaxBits extends number = MaxBits64, >( flags: FlagsT, startingBitIndex: number = 0, ): { [flag in FlagsT[MaxBits]]: number } { const x = flags.reduce((sum, flag, flagIndex) => { const bitmask = 1 << (startingBitIndex + flagIndex); return Object.assign(sum, { [flag]: bitmask }); }, {} as { [flag in FlagsT[MaxBits]]: number }); return x; }