TypeScript выводит тип возвращаемого значения обратного вызова в конструкторе типов - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу написать конструктор типа для функции, которая получает тип S и функцию из S для другого типа, затем применяет эту функцию к S и возвращает результат:

// This works but it's tied to the implementation
function dig<S, R>(s: S, fn: (s: S) => R): R {
  return fn(s);
}

// This works as separate type constructor but I have to specify `R`
type Dig<S, R> = (s: S, fn: (s: S) => R) => R;

// Generic type 'Dig' requires 2 type argument(s).
const d: Dig<string> = (s, fn) => fn(s); 

Так, как я могу написать конструктор типа Dig<S>, который выводит тип возвращаемого аргумента fn без указания R?

1 Ответ

3 голосов
/ 12 апреля 2019

Начиная с TS3.4 не поддерживается вывод аргумента частичного типа , поэтому компилятор не может легко позволить вам указать S, но сделать вывод R.Но из вашего примера не похоже, что вы хотите сделать вывод R как некоторый конкретный тип, но позволить ему оставаться универсальным, так что возвращаемый тип fn может быть тем, что он хочетбыть, когда вы вызываете d().

Так что, похоже, вы действительно хотите этот тип:

type Dig<S> = <R>(s: S, fn: (s: S) => R) => R;

Это своего рода «дважды универсальный» тип,в том смысле, что после того, как вы укажете S, у вас все еще есть универсальная функция, зависящая от R.Это должно работать для приведенного вами примера:

const d: Dig<string> = (s, fn) => fn(s);

const num = d("hey", (x) => x.length); // num is inferred as number
const bool = d("you", (x) => x.indexOf("z") >= 0); // bool inferred as boolean

Хорошо, надеюсь, это поможет.Удачи!

...