Задать вопрос
@HealSpirit

Можно ли убрать второй аргумент из дженерика при типизации функции, которая возвращает функцию?

Всем, привет. Не могу сделать след ситуацию
export interface TableEventMap {
  "cell:hover": { start: number; end: number };
  test2: number;
}

export const useEmitter = <EM extends Record<string, any>, K extends keyof EM>(event: K) => {
  return (payload: EM[K]) => {};
};

const emitTest1 = useEmitter<TableEventMap, "cell:hover">("cell:hover"); // const emitTest1: (payload: { start: number; end: number; }) => void
const emitTest2 = useEmitter<TableEventMap, "test2">("test2"); // const emitTest2: (payload: number) => void
// хочу добиться такого же, но не используя второй аргумент в дженерике
// const emitTest1 = useEmitter('cell:hover');
// const emitTest2 = useEmitter("test2");


// так работает, но идет завязка на TableEventMap, а хотелось бы общий тип оставить
export interface TableEventMap {
  "cell:hover": { start: number; end: number };
  test2: number;
}

export const useEmitter = <K extends keyof TableEventMap>(event: K) => {
  return (payload: TableEventMap[K]) => {};
};

const emitTest1 = useEmitter("cell:hover");
const emitTest2 = useEmitter("test2");

Есть какие-то мысли?
  • Вопрос задан
  • 71 просмотр
Подписаться 2 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Skillbox
    Frontend-разработчик
    9 месяцев
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
Без (кривых и некрасивых) костылей - низя.
https://github.com/microsoft/TypeScript/issues/20122
https://github.com/microsoft/TypeScript/issues/26242
https://github.com/microsoft/TypeScript/issues/10571

Но во многих случаях, например твоём, и не нужно. Не стоит руками кастовать тип, который на самом деле ничего не меняет в поведении. Сделай частный useTabeEmmiter который работает и внутри с нужным типом, или там const useTEmmiter = new EmmiterHook<T>({...}: T) - который честно выводит тип. Так куда меньше будет шанс ошибиться.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы