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

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

type ApplicationState = { count: number };
const selectCount = (state: ApplicationState) => state.count;

Я мог бы просто сделать это, установив ApplicationState в качестве типа для каждого параметра, но я пытаюсь дать тип самим селекторам:

const selectCount: ApplicationSelector = ({ count }) => count;

Я пробовал это:

type ApplicationSelector = (state: ApplicationState) => infer R ? R : any;

Однако документация по этому поводу дает понять, что этот синтаксис infer предполагается использовать с extends, но в данном случае я не уверен, что расширять.

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

0
Explosion Pills 14 Окт 2020 в 22:12

1 ответ

Лучший ответ

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

type AppState = {count: number};

function appSelector<S extends (state: AppState) => any>(selector: S) {
    return selector;
}

const selectCount = appSelector(({count}) => count);

Вот получившийся тип:

const selectCount: ({ count }: AppState) => number

И вы действительно сохраняете автозаполнение и проверку типов для деструктурированных свойств, таких как ({count}).

1
Paarth 14 Окт 2020 в 20:41