flat은 배열의 차원을 한 단계씩 낮추는 메서드입니다. 첫 배열인 A는 (number | (number | number[])[])[] 타입인 3차원 배열입니다. 여기서 R은 한 차원을 낮춘 2차원 배열이 되고, RR은 다시 한 차원을 낮췄으니 1차원 배열이 됩니다. RRR은 차원을 한 번 더 낮춘 것인데, 1차원 배열보다 더 낮게 낮출 수는 없으니 여전히 1차원 배열입니다.
flat 메서드에는 인수를 넣을 수 있는데, 이 인수가 낮출 차원 수를 의미합니다. 인수를 넣지 않으면 1차원만 낮추고, 인수를 제공하면 그 차원만큼 낮춥니다. R2는 2차원을 낮춘 것이므로 바로 1차원이 됩니다.
그런데 타입스크립트는 어떻게 한 차원 낮아진 타입을 추론할 수 있을까요? 생각해내기가 쉽지 않습니다. 타입스크립트가 어떻게 타이핑했는지 확인해봅시다.
flat 위에서 오른쪽 마우스를 눌러 Go to References를 선택하면 lib.es2019.array.d.ts를 확인할 수 있습니다. ES2019에 추가된 메서드라 lib.es5.d.ts 대신 lib.es2019.array.d.ts에 들어 있습니다.
다음은 lib.es2019.array.d.ts에서 중요한 부분을 추린 코드입니다.