Частичная перегрузка интерфейса Typescript приводит к неправильному выбору перегрузки

#typescript

#typescript

Вопрос:

Когда я пытаюсь определить перегрузку моей функции с частичной перегрузкой интерфейса, typescript выбирает неправильную перегрузку

 interface Args {
  _id: string;
  name: string;
}
interface Result {
  _id: string;
  name: string;
}

function myFunction(arg: Args): Result;
function myFunction(arg: Partial<Args>): Partial<Result> {
  return arg;
}

// Argument of type '{ _id: string; }' is not assignable to parameter of type 'Args'.
// Property 'name' is missing in type '{ _id: string; }' but required in type 'Args'
myFunction({ _id: 'aa' });
  

Попытка использовать myFunction({ _id: 'aa' } as Partial<Args>); не помогает

Как я мог бы заставить это работать?

Ответ №1:

Последняя подпись является подписью реализации и не является частью общедоступных подписей. Итак, ваша функция действительно включена, имеет одну доступную сигнатуру function myFunction(arg: Args): Resu< отсюда и ошибка.

 function myFunction(arg: Args): Result;
function myFunction(arg: Partial<Args>): Partial<Result>
function myFunction(arg: Partial<Args>): Partial<Result> {
  return arg;
}

myFunction({ _id: 'aa' });// ok now
  

Ссылка на игровую площадку

Комментарии:

1. Я добавлю, что порядок перегрузок имеет значение, поскольку typescript выберет первое, что работает, поэтому в этом случае вы всегда должны помещать частичное последним, иначе другое никогда не будет использовано