Определите тип для массива массива или числа и используйте оператор распространения

Я пытаюсь понять, как определить тип для массива, который имеет как массив, так и число.

input: [[2,7,11,15], 9]

// I tried
input: Array<Array<number> | number>

Однако, когда я использую это с оператором распространения, возникает ошибка A spread argument must either have a tuple type or be passed to a rest parameter.

tests.forEach((test) => {
  console.log(twoSumHashMap(...test.input))
})

const twoSumHashMap = (nums, target) => {
  let map = new Map(), required;

  for(let i = 0; i<nums.length; i++) {
    required = target - nums[i];
    if(map.has(required)) {
      return [map.get(required), i]
    } else {
      map.set(nums[i], i);
    }
  }
}
const tests: Array<{input: Array<Array<number> | number>, expected: Array<number>}> = [
  {input: [[2,7,11,15], 9], expected: [0,1]},
  {input: [[3,2,4], 6], expected: [1,2] },
  {input: [[3,3], 6], expected: [0,1] }
]

Обходной путь

Возможно, мне не нужно использовать здесь оператор распространения, и я могу просто использовать его, поскольку ввод всегда будет состоять из 2 элементов.

tests.forEach((test) => {
  console.log(twoSumHashMap(test.input[0], test.input[1]))
})

Есть ли лучший шаблон для использования машинописного текста здесь?

В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
0
0
15
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

twoSumHashMap ожидает только два аргумента. Массивы могут иметь размеры, отличные от 2, поэтому вы должны явно указать input как кортеж с двумя элементами (ТС детская площадка):

input: [number[], number]

Ваша функция также должна иметь возвращаемое значение, если она не может найти два числа и типы для входных данных (ТС детская площадка):

const twoSumHashMap = (nums: number[], target: number) => {
  const map = new Map();

  for(let i = 0; i<nums.length; i++) {
    const required = target - nums[i];
    
    if(map.has(required)) {
      return [map.get(required), i]
    }
    
    map.set(nums[i], i);
  }

  return [null, -1];
}

Другие вопросы по теме

Похожие вопросы

Передача vscode во внешние функции
Firebase: Почему мой код использует только первый документ в моей коллекции?
Реагировать на ошибку машинописного текста - элемент неявно имеет любой тип, потому что выражение строки типа не может использоваться для индексирования типа {}
Как получить доступ к вложенным необязательным индексам из интерфейса
Почему машинописный текст не может контекстуально вывести эти типы промежуточного программного обеспечения
Передать конструктор класса как функцию в другом классе
React & clsx: добавьте имя класса, если текущий элемент в сопоставленном массиве является первым из нескольких элементов
Свойство «MathFun» отсутствует в типе «(x?: число, y?: число) => число», но требуется в типе «Func».
Получение строки типа не может быть назначено строке типа для компонента TS в сборнике рассказов
Как ввести useState для файлов?