Начиная с 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
Хорошо, надеюсь, это поможет.Удачи!