Полагаю, вы используете бета-версию TypeScript 3.9 с новыми наборами для Array.flat()
. Основная проблема здесь заключается в том, что TypeScript в настоящее время не имеет цифр c литерального типа , соответствующего Infinity
(см. microsoft / TypeScript # 32277 для открытого предложения добавить это) ,
В данный момент тип Infinity
в TypeScript просто number
. Таким образом, компилятор понятия не имеет, что array.flat(Infinity)
собирается вернуть максимально плоский массив; вместо этого он обрабатывает его так, как будто вы вызвали array.flat(num)
, где num
- это какое-то number
-значное выражение. Это означает, что он понятия не имеет, насколько плоским будет конечный массив, и в итоге дает вам объединение всех возможных глубин выравнивания:
const z = [[[[[[0 as const]]]]]].flat(Infinity);
// const z: (0 | 0[] | 0[][] | 0[][][] | 0[][][][] | 0[][][][][])[]
Эта проблема с flat()
отмечена в комментарии в microsoft / TypeScript # 36554 , проблема, которая действует как набор сценариев использования для методов массива, которые в настоящее время не работают идеально в TypeScript. Если вы действительно заботитесь об этом, вы можете дать ему ?, чтобы люди знали, что сценарий использования используется.
Я бы посоветовал вам на данный момент просто передать большой -i sh цифра c константа, тип которой можно представить в виде цифры c литерал. Новые наборы точны только до глубины 20
или около того, так что вы можете выбрать что-то вроде этого:
const y = [[[[[[0 as const]]]]]].flat(20);
// const y: 0[]
const x = hello.flat(20); // number[]
Хорошо, надеюсь, это поможет; удачи!
Детская площадка ссылка на код