Как напечатать карри `map`? - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь набрать карри map функцию в TypeScript. Вот эквивалент JavaScript:

const double = n => n * 2;
const map = f => arr => arr.map(f);
const doubleArr = map(double);

console.log(doubleArr([1, 2, 3]));
// ↳ [2, 4, 6]

В идеале, TypeScript должен иметь возможность сделать вывод, что после предоставления double в map, doubleArray принимает массив чисел и возвращает массив чисел.

Вот что я попробовал:

const double = (n: number) => n * 2;
const map = (f: Function) => (arr: Array<any>) => arr.map(f);

Но TypeScript жалуется на f внутри map:

Argument of type 'Function' is not assignable to parameter of type '(value: any, index: number, array: any[]) => unknown'.
  Type 'Function' provides no match for the signature '(value: any, index: number, array: any[]): unknown'.

Как бы вы введите эту функцию в TypeScript?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

Вы можете объявить интерфейс и затем передать его вместо Function

interface ArrFunction<T> {
    (n: T): T
}

const double = (n: number) => n * 2;
const map = (f: ArrFunction<any>) => (arr: Array<any>) => arr.map(f);
1 голос
/ 01 февраля 2020

Вы можете использовать следующие объявления:

const double = (n: number) => n * 2;
const map = <A, R>(f: (arg: A) => R) => (arr: A[]) => arr.map(f);
const doubleArr = map(double); // (arr: number[]) => number[]

console.log(doubleArr([1, 2, 3]));
// ↳ [2, 4, 6]

Пример игровой площадки


Объяснение: A и R являются generi c параметры типа . map(double) возвращает функцию с сигнатурой (arr: number[]) => number[], поскольку TS может выводить из double печатаний, что A и R оба могут быть только number здесь.

0 голосов
/ 01 февраля 2020

Вы можете создать функцию map с двумя параметрами: массив и функцию, и когда вы хотите использовать эту функцию, вы должны передать элемент из массива этой функции.

const double = (n: number) => n * 2;
const map = (arr: Array<any>, f: Function) => arr.map((item: any) => f(item));
map([1, 2, 3], double)
...