Kozack
@Kozack
Thinking about a11y

Как исправить ошибку No overload matches TS?

Есть примерно такой код:

// реализация
function providerGetItem(id: number): Item
function providerGetItem(id: number[]): Item[]
function providerGetItem(id: number | number[]): Item | Item[] {
    return typeof id === 'number' ? {id} : id.map(id => ({id}))
}


// Абстракция
function getItem(id: number): Item
function getItem(id: number[]): Item[]
function getItem(id: number | number[]): Item | Item[] {
    return providerGetItem(id) // <-- TS2769: No overload matches this call
}


Playground.

Вызов providerGetItem(id) приводит к ошибке:

TS2769: No overload matches this call.   
Overload 1 of 2, '(myAnimeListId: number): Promise<Series | undefined>', gave the following error.     
Argument of type 'number | number[]' is not assignable to parameter of type 'number'.       
Type 'number[]' is not assignable to type 'number'.   

Overload 2 of 2, '(myAnimeListId: number[]): Promise<Series[]>', gave the following error.     
Argument of type 'number | number[]' is not assignable to parameter of type 'number[]'.       
Type 'number' is not assignable to type 'number[]'.

Как её исправить? Единственное что пришло в голову:
typeof id === 'number' ? providerGetItem(id) : providerGetItem(id)
  • Вопрос задан
  • 1264 просмотра
Пригласить эксперта
Ответы на вопрос 1
Ahmad66617
@Ahmad66617
Senior Fullstack Engineer
В твоем коде - в реализации ты задал винегрет из типов - причем одноименных - и компилятор путается - какой использовать - удали лишние - и оставь общий(где можно передать или число или массив с числом) - и все заработает.
Либо еще есть вариант наподобие того что ты предлагал - проверят входной тип аргумента - т е на if-ах - если число - то один возврат, если массив то другой(ставил на пробу такой же) - все работает - только кода больше.

type Item = {id: number}

function providerGetItem(id: number | number[]): Item | Item[] {
return typeof id === 'number' ? {id} : id.map(id => ({id}))
}

function getItem(id: number | number[]): Item | Item[] {
return providerGetItem(id);
}

console.log(getItem(1))
console.log(getItem([2]))
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы