Есть ли сахар с дополнительным объединением цепочек / нулевым значением для предотвращения ошибок типа с помощью, скажем, Array.map?

Есть ли сахар, чтобы гарантировать, что карта не будет печатать с ошибками, используя такие инструменты, как необязательное связывание / nullishcoalescing ?

let x = {y: 1, z: 2};

x?.map(i => i); // Typeerror
Array.isArray(x)?.map(i => i); // Typeerror

let y = '1234';
y?.length && y.map(i => i) // Typeerror

person Armeen Harwood    schedule 08.02.2020    source источник
comment
Эти ошибки типа кажутся правильными. Какая здесь цель? Очевидно, вы не можете вызвать map для литерала объекта, логического или строкового.   -  person Eric F.    schedule 08.02.2020
comment
Да Просто ищу краткий способ избежать Array.isArray(x) && x.map   -  person Armeen Harwood    schedule 08.02.2020
comment
Ах хорошо! Понятно. Посмотрите, помогает ли приведенное ниже.   -  person Eric F.    schedule 08.02.2020
comment
Немного странно (и часто указывает на вонючий код) заранее не знать, является ли что-то массивом или нет. Если вы когда-нибудь столкнетесь с такой ситуацией, подумайте о том, чтобы исправить что-то в апстриме.   -  person CertainPerformance    schedule 08.02.2020
comment
@CertainPerformance Использовали опциональную цепочку с нулевым объединением внутри JSX? Переключение компонентов на основе типов данных объединения Array | number - довольно распространенный вариант использования, и он становится очень элегантным с помощью Optional Chaining + Nullish Coalescing.   -  person Armeen Harwood    schedule 08.02.2020


Ответы (1)


Эти ошибки типа кажутся правильными. Очевидно, вы не можете вызвать map для литерала объекта, логического или строкового.

Если вы все равно хотите дополнительно вызвать карту, вы можете продолжить необязательную цепочку с помощью ?.(params):


let x = {y: 1, z: 2};

x?.map?.(i => i);
Array.isArray(x)?.map?.(i => i);

let y = '1234';
y?.length && y.map?.(i => i)

Имейте в виду, что это только проверяет, существует ли свойство с именем map и не равно нулю / неопределенному. Если он существует, но не является функцией, вы все равно получите сообщение об ошибке.

person Eric F.    schedule 08.02.2020