Как реализовать карту с сопоставлением с образцом - PullRequest
0 голосов
/ 14 сентября 2018

Я хотел написать реализацию сопоставления с шаблоном map, поэтому я написал это:

const map = (f, [x, ...xs]) => {
  return (!x && !xs) ? [] : [f(x), ...map(f, xs)];
}

Однако компилятор жалуется на параметр xs в рекурсивном вызове:

Аргумент типа 'any []' не может быть присвоен параметру типа '[any, ... any []]'.Свойство '0' отсутствует в типе 'any []'

Я также пытался [f(x), ...map(f, [xs])], но это приводит к ошибке переполнения стека.

Что я делаю не так?

1 Ответ

0 голосов
/ 14 сентября 2018

Если я правильно понимаю, я думаю, что проблема заключалась в сравнении аргумента ... xs через &&, из-за которого рекурсия никогда не заканчивалась. Вы действительно заботитесь только о наличии следующего массива, который будет обрабатываться, остальное будет поймано следующей рекурсией.

Ошибка компилятора происходит из-за отсутствия определения типа для массива аргументов, и tsc выводит его из источника: но тип [any, ... any []] слишком узок. Ввод массива с помощью: any [] устраняет проблему.

Надеюсь, это поможет.

const map = (f, [x, ...rest]:any[]) => {
  return (!x) ? [] : [f(x), ...map(f, rest)];
}

console.log(map(x=>x+10, [1,2,3]))
...