Правильный набор текста для Array.flat (Infinity) - PullRequest
0 голосов
/ 25 апреля 2020

Я узнал о новом методе Array.flat и подумал, что буду использовать его, чтобы опробовать его, но возвращаемый тип нежелателен.

const hello = [1, 2, [3], [[4]]]

const x = hello.flat(Infinity)

Это устанавливает * Тип 1007 * как:

const x: (number | number[] | number[][])[]

Как я могу получить это, чтобы number[]?

1 Ответ

1 голос
/ 25 апреля 2020

Полагаю, вы используете бета-версию 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[]

Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

...