Как назначить правильную сигнатуру типа для этой функции карри в машинописи? - PullRequest
0 голосов
/ 11 ноября 2018

Я новичок в машинописи и дженериках и работаю с монадой Maybe. Я создал эту небольшую служебную функцию, используя Ramda:

const fromEmpty = R.ifElse(hasLength, Just, Maybe.zero);

Самая близкая подпись, которую я могу сделать из этого:

type EmptyFunc<T> = (val: T[]) => Maybe<T[]>;

Эта функция принимает массив и возвращает функцию, которая возвращает Maybe этого массива.

Я пытался сделать

const fromEmpty(<U extends EmptyFunc<U>) = R.ifElse(hasLength, Just, Maybe.zero);

Но это не работает. Возвращает error TS1005: ',' expected.

Как правильно работать с карри-функциями в машинописи?

1 Ответ

0 голосов
/ 11 ноября 2018

Декларация

type EmptyFunc<T> = (val: T[]) => Maybe<T[]>;

объявляет семейство различных типов функций EmptyFunc<number>, EmptyFunc<string> и т. Д., Каждый из которых работает только для указанного типа T. Вы, вероятно, имели в виду

type EmptyFunc = <T>(val: T[]) => Maybe<T[]>;

, который объявляет тип EmptyFunc одной универсальной функции, которая работает для всех типов T. Затем, чтобы применить этот тип к fromEmpty, просто напишите:

const fromEmpty: EmptyFunc = R.ifElse(hasLength, Just, Maybe.zero);

(Я сам не могу проверить это, поскольку вы не дали определения hasLength, Just и Maybe.) Если это не то, о чем вы спрашивали, уточните вопрос.

...