Как объявить тип для функции, которая возвращает функцию с выведенным типом в машинописи? - PullRequest
1 голос
/ 18 апреля 2020

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

const someSelector1 = (state: ContextState) => () => state.currentName; 

const someSelector2 = (state: ContextState) => (id: string) => state[id].values; 

Я хотел бы создать тип, который будет назначен функциям "someSelector", и который будет выводить типы функция возврата. Примерно так:

type Selector = <F extends Function>(state: ContextState) => F

const someSelector1: Selector = (state) => () => state.currentName; 

const someSelector2: Selector = (state) => (id: string) => state[id].values; 

К сожалению, в этой реализации я получаю Type '(id: string) => string' is not assignable to type 'F'. '(id: string) => string' is assignable to the constraint of type 'F', but 'F' could be instantiated with a different subtype of constraint 'Function'. ошибку.

Есть ли правильный способ сделать это?

1 Ответ

1 голос
/ 19 апреля 2020

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

type Selector<T extends () => any> = (state: ContextState) => T;

function applySelector<T extends () => any>(selector: Selector<T>): ReturnType<T> {
  // code
}

Теперь вызов applySelector с селектором, который возвращает T, также вернет T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...