// Iterator approach, seems to be good up until ~850 type Result = Take<100, FizzBuzzIterator[1]> // ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz", ...] export type FizzBuzzIterator< S extends Record = { 3: []; 5: []; i: [] }, R extends string = `${S[3]["length"] extends 3 ? "Fizz" : ""}${S[5]["length"] extends 5 ? "Buzz" : ""}` > = [ R extends "" ? `${S["i"]["length"]}` : R, FizzBuzzIterator<{ 3: S[3]["length"] extends 3 ? [1] : [...S[3], 1] 5: S[5]["length"] extends 5 ? [1] : [...S[5], 1] i: [...S["i"], 1] }> ] type Take = Acc["length"] extends N ? Acc : Take