@djEban

TypeScript. Как сделать оверлоад объекта стрелочной функции?

Всем привет.
Пытаюсь создать главную функцию (myFuncAs), а потом побочную (wrapMyFuncAs), принимающую конфиг функции myFuncAs. В конце результат должен быть строкой, так как передал true, но вышло число.

type Obj<T extends boolean = boolean> = {
  apply?: T;
};

type MyFunc = (obj?: Obj) => string | number;

type MyFuncAs = ((obj?: Obj<false>) => number) &
  ((obj?: Obj<true>) => string) &
  ((obj?: Obj) => number);

const myFunc: MyFunc = obj => {
  if (obj?.apply) return "";
  return 5;
};

const myFuncAs = myFunc as MyFuncAs;

const wrapMyFuncAs = <T extends boolean>(obj?: Obj<T>) => myFuncAs(obj);

const result = wrapMyFuncAs({ apply: true });  <---- компилятор показывает, что result - число


TS почему-то решает, что актуален только последний оверлоад
((obj?: Obj) => number);

Если я вызову просто myFuncAs, например, вот так:
const result = myFuncAs({ apply: true });
то все хорошо.

Можно ли это как-то фиксануть, чтоб оно работало?
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
ТС недостаточно умный для этого. Решает он так, потому что когда ты делаешь SomeType extends BaseType для аргумента функции, внутри функции значение этого аргумента просто BaseType и автоматический вывод исходит из этого. Тут либо добавлять руками оверлоады и на враппер, или пробовать писать головоломный тип, или обойтись без оверлоадов явными условиями типа:
type MyFuncAs =<T extends boolean> (obj?: Obj<T>) => T extends false ? number : string;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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