Тип [неопределенный, неопределенный] | [число, число] не может быть присвоен типу [число, число]

#javascript #typescript

#javascript #typescript

Вопрос:

Все это с использованием TypeScript .

У меня есть функция с именем ‘extent’ из внешней библиотеки, которая возвращает либо [число, число], либо [неопределенный, неопределенный], поэтому я не могу изменить саму эту функцию.

У меня есть функция с именем ‘getMaxRange’, и она принимает массив чисел и возвращает массив длиной 2, каждый из которых содержит число, как таковое: [число, число]

Если я наберу что-то вроде

 getMaxRange = (points: number[]) : [number, number] => {
    const range = extent(points));
    if (range == [undefined, undefined]) {
        return [0,1];
    }
    else{
        return range;
    }

}
  

это выдает ошибку, которая Type [undefined, undefined] | [number, number] is not assignable to type [number, number] .

Каков наилучший подход, чтобы сделать так, чтобы я не получал эту ошибку? Как я могу заставить его узнать, что диапазон больше не может быть [неопределенным, неопределенным]?

Ответ №1:

if (range == [undefined, undefined]) всегда false . Использование == или === для сравнения массивов проверяет, являются ли они одним и тем же массивом, а не имеют ли они одинаковое содержимое.

Вам нужно будет проверить элементы массива:

 if (range[0] === undefined amp;amp; range[1] === undefined)
  

Ссылка на игровую площадку

На самом деле, учитывая типы, достаточно просто проверить один элемент:

 if (range[0] === undefined)
  

Ссылка на игровую площадку

С точки зрения времени выполнения это также сработало бы:

 if (range.includes(undefined))
  

но с этим TypeScript не распознает защиту, и вам придется явно пометить его утверждением, поэтому, вероятно, лучше использовать первую версию.

Комментарии:

1. ах да, это сделало бы это, полностью прошло через мою голову

2. @AndrewZaw — 🙂 Рад, что помогло!

3. @AndrewZaw — я только что понял, что с учетом типов вам действительно нужно проверить только один элемент. Обновлен ответ. 🙂

Ответ №2:

Вы можете проверять элементы массива

 getMaxRange = (points: number[]) : [number, number] => {
    const range = extent(points));
    if (range[0] === undefined || range[1] === undefined) {
        return [0,1];
    }
    else{
        return range;
    }

}