ReturnType для указанной c перегрузки универсальной функции c - PullRequest
1 голос
/ 27 мая 2020

Итак, я искал, есть ли лучший способ написать типизацию для функции redux s bindActionCreators.

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

Итак,

const bound = bindActionCreators({ foo: () => "bar" }, dispatch);
bound.foo() // this should return the result of calling `dispatch("bar")`.

Dispatch в данном случае это почти любая функция - вот что делает ее интересной.

Я пробовал реализовать это, но все, что я получаю в качестве окончательного типа, - это unknown. Я упустил здесь что-то важное или это просто невозможно?

import {ActionCreatorsMapObject, Dispatch,AnyAction} from 'redux';

declare function bindActionCreators<A, M extends ActionCreatorsMapObject<A>, D extends Dispatch>(
  actionCreators: M,
  dispatch: D
): { 
  [K in keyof M]: D extends (action: ReturnType<M[K]>) => infer Ret ? (...args: Parameters<M[K]>) => Ret : M[K] 
}

// usage:

import {ThunkDispatch} from 'redux-thunk'

declare const thunkDispatch: ThunkDispatch<{}, undefined, AnyAction>;

const bound = bindActionCreators({
  normalAction: (foo: string) => ({type: "normalAction", foo}),
  thunkAction: (foo: string) => () => Promise.resolve({type: "thunk", foo}),
}, thunkDispatch)

// these are unfortunately `unknown`, not the expected types
const normal: {type: "normalAction", foo: string} = bound.normalAction("asd");
const thunk: Promise<{type: "normalAction", foo: string}> = bound.thunkAction("qwe")

TypeScript игровая площадка

...