Эти строки кода ...
export function sameFlatMap<T>(array: T[], mapfn: (x: T, i: number) => T | ReadonlyArray<T>): T[];
export function sameFlatMap<T>(array: ReadonlyArray<T>, mapfn: (x: T, i: number) => T | ReadonlyArray<T>): ReadonlyArray<T>;
export function sameFlatMap<T>(array: T[], mapfn: (x: T, i: number) => T | T[]): T[] {
let result: T[] | undefined;
if (array) {
for (let i = 0; i < array.length; i++) {
const item = array[i];
const mapped = mapfn(item, i);
if (result || item !== mapped || isArray(mapped)) {
if (!result) {
result = array.slice(0, i);
}
if (isArray(mapped)) {
addRange(result, mapped);
}
else {
result.push(mapped);
}
}
}
}
return result || array;
}
... существует в строке 702 компилятора / core.ts в источнике реализации компилятора TypeScript.
Почему эта компиляция не вызывает ошибку перегрузки?
Я спрашиваю, потому что я ожидаю, что это произойдет с ошибкой по той же причине, показанной в первом примере ниже - то есть при попытке передать ReadonlyArray<T>
параметру, который ожидает T[]
.
Почему это не приводит к этой ошибке:
src/compiler/core.ts:702:21 - error TS2394: This overload signature is not compatible with its implementation signature.
702 export function sameFlatMap<T>(array: ReadonlyArray<T>, mapfn: (x: T, i: number) => T | ReadonlyArray<T>): ReadonlyArray<T>;
Если я попробую это в своем коде, то это ошибка перегрузки ...
export function foo<T>(array: ReadonlyArray<T>): ReadonlyArray<T>;
export function foo<T>(array: T[]): T[] {
return array;
}
... тогда как это не ошибка ...
export function baz<T>(array: T[]): T[];
export function baz<T>(array: ReadonlyArray<T>): ReadonlyArray<T> {
return array;
}
... и я думаю, это потому что:
T[]
в качестве входного параметра можно передать функции, которая ожидает ReadonlyArray<T>
в качестве входного параметра (но не наоборот)
- Проверка ошибок перегрузки проверяет только типы входных параметров, а не типы возврата