Ошибка при перегрузке функции TS
Кто-нибудь может мне объяснить, почему это работает:
interface M {
(a: number): any;
(a: number[]): any;
}
const foo: M = (a) => {
if (Array.isArray(a)) {
return a.map((num) => num > 0 || num === 0 ? num : num * -1)
} else {
return a > 0 || a === 0 ? a : a * -1;
}
}
а если я поменяю интерфейс на
interface M {
(a: number): number;
(a: number[]): number[];
}
что кажется вполне логичным, то получаю следующую ошибку
Type '(a: number | number[]) => number | number[]' is not assignable to type 'M'.
Type 'number | number[]' is not assignable to type 'number'.
Type 'number[]' is not assignable to type 'number'.
Я не понимаю...
Ответы (1 шт):
Автор решения: Grundy
→ Ссылка
Тип any совместим с любым другим типом. Поэтому работает первый вариант.
Во втором варианте указывается конкретный тип возвращаемого значения. Проблема заключается в том, что реализация должна удовлетворять сразу всем перегрузкам в данном случае.
То есть, одновременно должен возвращаться и number и number[]. Что в typescript возможно только при использовании any в качестве возвращаемого значения:
interface M {
(a: number): number;
(a: number[]): number[];
}
const foo: M = (a): any => {
if (Array.isArray(a)) {
return a.map((num) => num > 0 || num === 0 ? num : num * -1)
} else {
return a > 0 || a === 0 ? a : a * -1;
}
}