Используйте интерфейс функции для обеспечения параметров, но выведите более конкретный тип возвращаемого значения. - PullRequest
0 голосов
/ 08 марта 2019

У меня есть сигнатура функции, которой нужно несколько функций, чтобы следовать ей, что-то вроде этого:

type ActionCallback<R = any> = (param1: SpecificType, param2: OtherType) => Promise<R>

В основном типы параметров хорошо определены, и они должны возвращать обещание, но что этоОбещание разрешается до функции.

Вместо того, чтобы указывать тип обоих аргументов в каждом обратном вызове, я хотел бы просто указать, что переменная соответствует ActionCallback, поэтому типы параметров выводятся:

const callback1: ActionCallback = async (a,b) => ({state: b().form, stuff: a});
const callback2: ActionCallback = async e => e.name; // doesn't need second arg in some cases

Однако, делая это таким образом, обобщенный аргумент не может быть выведен, поэтому я должен либо явно указать тип возвращаемого значения, либо оставить его по умолчанию any

Есть ли способчтобы минимизировать количество типов, которые необходимо явно пометить, убедитесь, что функция возвращает обещание и выводит разрешение обещания из тела функции?

1 Ответ

1 голос
/ 08 марта 2019

Поскольку функции могут выводить универсальный тип в своих аргументах, простая функция, которую можно обернуть, может получить такое поведение:

function MakeCallback<R>(callback: ActionCallback<R>): ActionCallback<R> {
    return callback;
}

const callback1 = MakeCallback(async e => e.name); // now can infer the return as Promise<typeof e.name>
...