Я пытаюсь создать набранный шаблон посредника в TypeScript. Сам шаблон работает без проблем, но я бы хотел, чтобы он был полностью напечатан без избыточности (не определяя конкретный тип c для регистрации команды и диспетчера отдельно).
Это означает, что всякий раз, когда я делаю:
dispatchCommand({
type: "SAVE_EVIDENCE_EVALUATION",
command: {
// This gets autocompleted with the right typing
}
Вот что мне удалось сделать до сих пор:
Нетипизированный код посредника
let commands = {};
export const registerCommand = ({ type, handler }) => {
commands[type] = handler;
};
export const dispatchCommand= async ({ type, command }) => {
logTime(type);
return commands[type](command);
};
Я бы зарегистрировал команду, как это:
registerCommand("CREATE_NEW_INSTITUTION_ACCOUNT", CreateNewInstitutionAccountCommandHandler);
И я бы запустил ее, как это:
const result = await dispatchCommand("CREATE_NEW_INSTITUTION_ACCOUNT", {
tenantId: 'my-id',
employeeId: 'the-other-id'
});
Я пытался в течение нескольких часов, как создать общий тип, поэтому я могу безопасно зарегистрировать команду с уже доступным типом.
Примечание: я всегда мог сделать 2 типа, но это несколько отразило бы назначение системы типов, так как я постоянно забываю добавлять ее в нескольких местах
Вот такой подход (TypeScript) :
type MediatorDispatcherForCommands = (({
type,
handler,
command,
}: {
type: "SAVE_EVIDENCE_EVALUATION";
handler?: typeof SaveEvidenceEvaluationCommandHandler;
command?: SaveEvidenceEvaluationCommand;
}) => ReturnType<typeof SaveEvidenceEvaluationCommandHandler>) &
(({
type,
handler,
command,
}: {
type: "SEED_DATABASE_INDIVIDUAL";
handler?: typeof SaveEvidenceEvaluationCommandHandler;
command?: SeedDataForIndividualAccountCommand;
}) => ReturnType<typeof SeedDataForIndividualAccountCommandHandler>);
Я пробовал множество подходов. Я пытался разделить его на разные объекты. Я пытался принудительно потребовать один параметр (который я не знаю, как, когда он деструктурируется в параметре ..., деструктурируя это позволяет мне автозаполнение, когда предоставляется ключ type
).
Это работает для диспетчера, но не для команды.
export const dispatchCommand: MediatorDispatcherForCommands = async ({ type, command }) => {
logTime(type);
return commands[type](command);
};
Есть идеи?