Извлечение машинописных подписей из объекта в интерфейс - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть привычка, когда я, кажется, дублирую множество набранных слов при передаче информации в редукции.Есть ли способ автоматически сгенерировать интерфейсные реквизиты, когда все они определены в ActionCreators?См. Код ниже:

import { bindActionCreators, Dispatch } from "redux";
const ActionCreators = {
  foo: (a: string): string => ("foo" + a),
  bar: (a: number): string => ("bar" + a),
  baz: (a: boolean): number => (a ? 256 : 123)
};

interface Props {
  foo: (a: string) => string;
  bar: (a: number) => string;
  baz: (a: boolean) => number;
}

const mapDispatchToProps = (dispatch: Dispatch): Props => {
  return bindActionCreators(ActionCreators, dispatch);
};

Понимание bindActionCreators не требуется, реальная проблема здесь заключается в получении всех подписей ActionCreators для извлечения в интерфейс, такой как Props.

1 Ответ

0 голосов
/ 21 ноября 2018

Вы можете просто использовать оператор типа typeof, чтобы получить тип любой константы.Затем вы можете использовать псевдоним типа, чтобы дать ему имя

const ActionCreators = {
  foo: (a: string): string => ("foo" + a),
  bar: (a: number): string => ("bar" + a),
  baz: (a: boolean): number => (a ? 256 : 123)
};

type Props = typeof ActionCreators;
/*
Same as
type Props = {
  foo: (a: string) => string;
  bar: (a: number) => string;
  baz: (a: boolean) => number;
} 
*/

Хотя между интерфейсами и псевдонимами типов есть небольшие различия, в этом случае они должны быть эквивалентны.

Редактировать

Последующий вопрос в комментариях: Как я могу изменить тип возвращаемого значения на void для всех функций-членов?

Для этого вам нужно использовать сопоставленный тип для сопоставления оригиналавведите новый тип и условный тип для извлечения типов аргументов исходной функции:

type ArgumentTypes<T> = T extends (...a: infer A) => any ? A: [] //Conditional type extracts the argument types
type Props = {
  // Mapped type, maps the keys of the original type to a new type
  // with the same keys, and with each key being a function with the same argument as the original 
  // but returning void.
  [P in keyof typeof ActionCreators]: (...a: ArgumentTypes<typeof ActionCreators[P]>) => void
}
...